Share via


프로젝트 템플릿에 마법사 사용

Visual Studio에서는 사용자가 템플릿을 사용하여 프로젝트를 만들 때 사용자 지정 코드를 실행할 수 있도록 설정하여 구현 시 IWizard 인터페이스를 제공합니다.

프로젝트 템플릿 사용자 지정은 사용자 입력을 수집하여 템플릿을 사용자 지정하거나 템플릿에 파일을 추가하거나 프로젝트에서 허용되는 다른 작업을 수행하는 사용자 지정 UI를 표시하는 데 사용할 수 있습니다.

사용자가 새 프로젝트 대화 상자에서 확인을 클릭하는 순간부터 시작하여 IWizard 인터페이스 메서드는 프로젝트를 만드는 동안 여러 번 호출됩니다. 인터페이스의 각 메서드는 호출 지점을 설명하도록 이름이 지정됩니다. 예를 들어 Visual Studio는 프로젝트 만들기를 시작할 때 즉시 RunStarted를 호출하므로, 사용자 입력을 수집하는 사용자 지정 코드를 작성하기에 적합한 위치입니다.

VSIX 프로젝트를 사용하여 프로젝트 템플릿 프로젝트 만들기

Visual Studio SDK의 일부인 프로젝트 템플릿 프로젝트를 사용하여 사용자 지정 템플릿 만들기를 시작합니다. 이 절차에서는 C# 프로젝트 템플릿 프로젝트가 사용되지만 Visual Basic 프로젝트 템플릿 프로젝트도 사용 가능합니다. 그런 다음, 프로젝트 템플릿 프로젝트가 포함된 솔루션에 VSIX 프로젝트를 추가합니다.

  1. C# 프로젝트 템플릿 프로젝트를 만듭니다(Visual Studio에서 파일>새로 만들기>프로젝트를 선택하고 “프로젝트 템플릿” 검색). 이름을 MyProjectTemplate으로 지정합니다.

    참고 항목

    Visual Studio SDK를 설치하라는 메시지가 표시될 수 있습니다. 자세한 내용은 Visual Studio SDK 설치를 참조하세요.

  2. 프로젝트 템플릿 프로젝트와 동일한 솔루션에 새 VSIX 프로젝트를 추가합니다(솔루션 탐색기에서 솔루션 노드를 선택하고, 마우스 오른쪽 단추로 클릭하고, 추가>새 프로젝트를 선택하고 "vsix" 검색). 이름을 MyProjectWizard로 지정합니다.

  3. VSIX 프로젝트를 시작 프로젝트로 설정합니다. 솔루션 탐색기에서 VSIX 프로젝트 노드를 선택하고 마우스 오른쪽 단추를 클릭하여 시작 프로젝트로 설정을 선택합니다.

  4. 템플릿 프로젝트를 VSIX 프로젝트의 자산으로 추가합니다. 솔루션 탐색기의 VSIX 프로젝트 노드에서 source.extension.vsixmanifest 파일을 찾습니다. 두 번 클릭하여 매니페스트 편집기로 엽니다.

  5. 매니페스트 편집기에서 창 왼쪽의 자산 탭을 선택합니다.

  6. 자산탭에서 새로 만들기를 선택합니다. 새 자산 추가 창의 형식 필드에 대해 Microsoft.VisualStudio.ProjectTemplate을 선택합니다. 원본 필드에서 현재 솔루션의 프로젝트를 선택합니다. 프로젝트 필드에서 MyProjectTemplate을 선택합니다. 그런 후 OK를 클릭합니다.

  7. 솔루션을 빌드하고 디버깅을 시작합니다. 두 번째 Visual Studio 인스턴스가 표시됩니다. 몇 분이 걸릴 수 있습니다.

  8. 두 번째 Visual Studio 인스턴스에서 새 템플릿을 사용하여 새 프로젝트를 만듭니다(파일>새로 만들기>프로젝트, "myproject" 검색). 새 프로젝트가 Class1이라는 클래스와 함께 표시됩니다. 이제 사용자 지정 프로젝트 템플릿이 생성되었습니다! 이제 디버깅을 중지합니다.

사용자 지정 템플릿 마법사 만들기

이 절차에서는 프로젝트를 만들기 전에 Windows Form을 여는 사용자 지정 마법사를 만드는 방법을 보여 줍니다. 이 양식을 사용하면 프로젝트를 만드는 동안 원본 코드에 추가되는 사용자 지정 매개 변수 값을 추가할 수 있습니다.

  1. 어셈블리를 만들 수 있도록 VSIX 프로젝트를 설정합니다.

  2. 솔루션 탐색기에서 VSIX 프로젝트 노드를 선택합니다. 솔루션 탐색기 아래에 속성 창이 표시됩니다. 그렇지 않으면 보기>속성 창을 선택하거나 F4 키를 누릅니다. 속성 창에서 다음 필드를 true로 선택합니다.

    • VSIX 컨테이너에 어셈블리 포함

    • 로컬 VSIX 배포에 디버그 기호 포함

    • VSIX 컨테이너에 디버그 기호 포함

  3. VSIX 프로젝트에 어셈블리를 자산으로 추가합니다. source.extension.vsixmanifest 파일을 열고 자산 탭을 선택합니다. 새 자산 추가 창에서 형식에 대해 Microsoft.VisualStudio.Assembly를 선택하고, 원본에 대해 현재 솔루션의 프로젝트를 선택하고, 프로젝트에 대해 MyProjectWizard를 선택합니다.

  4. VSIX 프로젝트에 다음 참조를 추가합니다. (솔루션 탐색기의 VSIX 프로젝트 노드에서 참조를 선택하고, 마우스 오른쪽 단추로 클릭하고, 참조 추가를 선택합니다.) 참조 추가 대화 상자의 프레임워크 탭에서 System.Windows Forms 어셈블리를 찾아서 선택합니다. 또한 SystemSystem.Drawing 어셈블리를 찾아서 선택합니다. 이제 확장 탭을 선택합니다. EnvDTE 어셈블리를 찾아서 선택합니다. 또한 Microsoft.VisualStudio.TemplateWizardInterface 어셈블리를 찾아서 선택합니다. 확인을 클릭합니다.

  5. 마법사 구현에 대한 클래스를 VSIX 프로젝트에 추가합니다. (솔루션 탐색기에서 VSIX 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고, 추가, 새 항목, 클래스를 차례로 선택합니다.) 클래스 이름을 WizardImplementation으로 지정합니다.

  6. WizardImplementationClass.cs 파일의 코드를 다음 코드로 바꿉니다.

    using System;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TemplateWizard;
    using System.Windows.Forms;
    using EnvDTE;
    
    namespace MyProjectWizard
    {
        public class WizardImplementation:IWizard
        {
            private UserInputForm inputForm;
            private string customMessage;
    
            // This method is called before opening any item that
            // has the OpenInEditor attribute.
            public void BeforeOpeningFile(ProjectItem projectItem)
            {
            }
    
            public void ProjectFinishedGenerating(Project project)
            {
            }
    
            // This method is only called for item templates,
            // not for project templates.
            public void ProjectItemFinishedGenerating(ProjectItem
                projectItem)
            {
            }
    
            // This method is called after the project is created.
            public void RunFinished()
            {
            }
    
            public void RunStarted(object automationObject,
                Dictionary<string, string> replacementsDictionary,
                WizardRunKind runKind, object[] customParams)
            {
                try
                {
                    // Display a form to the user. The form collects
                    // input for the custom message.
                    inputForm = new UserInputForm();
                    inputForm.ShowDialog();
    
                    customMessage = UserInputForm.CustomMessage;
    
                    // Add custom parameters.
                    replacementsDictionary.Add("$custommessage$",
                        customMessage);
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.ToString());
                }
            }
    
            // This method is only called for item templates,
            // not for project templates.
            public bool ShouldAddProjectItem(string filePath)
            {
                return true;
            }
        }
    }
    

    이 코드에 참조된 UserInputForm은 나중에 구현됩니다.

    WizardImplementation 클래스에는 IWizard의 모든 멤버에 대한 메서드 구현이 포함됩니다. 이 예제에서는 RunStarted 메서드만 작업을 수행합니다. 다른 모든 메서드는 아무 것도 수행하지 않거나 true를 반환합니다.

    RunStarted 메서드에는 4개의 매개 변수가 허용됩니다.

    • Object 매개 변수는 프로젝트를 사용자 지정할 수 있도록 루트 _DTE 개체로 캐스팅할 수 있습니다.

    • Dictionary<TKey,TValue> 매개 변수에는 템플릿에 미리 정의된 모든 매개 변수의 컬렉션이 포함됩니다. 템플릿 매개 변수에 대한 자세한 내용은 템플릿 매개 변수를 참조하세요.

    • WizardRunKind 매개 변수에는 사용 중인 템플릿 종류에 대한 정보가 포함됩니다.

    • Object 배열에는 Visual Studio에서 마법사로 전달되는 매개 변수 세트가 포함됩니다.

      이 예제는 사용자 입력 양식의 매개 변수 값을 Dictionary<TKey,TValue> 매개 변수에 추가합니다. 프로젝트에서 모든 $custommessage$ 매개 변수 인스턴스가 사용자가 입력한 텍스트로 바뀝니다.

  7. 이제 UserInputForm을 만듭니다. WizardImplementation.cs 파일에서 WizardImplementation 클래스 종료 후 다음 코드를 추가합니다.

    public partial class UserInputForm : Form
        {
            private static string customMessage;
            private TextBox textBox1;
            private Button button1;
    
            public UserInputForm()
            {
                this.Size = new System.Drawing.Size(155, 265);
    
                button1 = new Button();
                button1.Location = new System.Drawing.Point(90, 25);
                button1.Size = new System.Drawing.Size(50, 25);
                button1.Click += button1_Click;
                this.Controls.Add(button1);
    
                textBox1 = new TextBox();
                textBox1.Location = new System.Drawing.Point(10, 25);
                textBox1.Size = new System.Drawing.Size(70, 20);
                this.Controls.Add(textBox1);
            }
            public static string CustomMessage
            {
                get
                {
                    return customMessage;
                }
                set
                {
                    customMessage = value;
                }
            }
            private void button1_Click(object sender, EventArgs e)
            {
                customMessage = textBox1.Text;
                this.Close();
            }
        }
    

    사용자 입력 양식은 사용자 지정 매개 변수를 입력하기 위한 간단한 양식을 제공합니다. 양식에는 이름이 textBox1인 텍스트 상자와 이름이 button1인 단추가 포함되어 있습니다. 단추를 클릭하면 텍스트 상자의 텍스트가 customMessage 매개 변수에 저장됩니다.

사용자 지정 템플릿에 마법사 연결

사용자 지정 프로젝트 템플릿에 사용자 지정 마법사를 사용하기 위해서는 마법사 어셈블리를 서명하고 사용자 지정 프로젝트 템플릿에 일부 줄을 추가하여 새 프로젝트가 생성될 때 마법사 구현을 찾을 위치를 알 수 있도록 해야 합니다.

  1. 어셈블리에 서명합니다. 솔루션 탐색기에서 VSIX 프로젝트를 선택하고, 마우스 오른쪽 단추로 클릭하여 프로젝트 속성을 선택합니다.

  2. 프로젝트 속성 창에서 서명 탭을 선택합니다. 서명 탭에서 어셈블리 서명을 선택합니다. 강력한 이름 키 파일 선택 필드에서 <새로 만들기>를 선택합니다. 강력한 이름 키 만들기 창의 키 파일 이름 필드에 key.snk를 입력합니다. 암호로 내 키 파일 보호 필드를 선택 취소합니다.

  3. 솔루션 탐색기에서 VSIX 프로젝트를 선택하고 속성 창을 찾습니다.

  4. 출력 디렉터리에 빌드 출력 복사 필드를 true로 설정합니다. 이렇게 하면 솔루션을 다시 빌드할 때 어셈블리가 출력 디렉터리에 복사됩니다. 여전히 .vsix 파일에 포함되어 있습니다. 서명 키를 찾으려면 어셈블리를 확인해야 합니다.

  5. 솔루션을 다시 빌드합니다.

  6. 이제 MyProjectWizard 프로젝트 디렉터리에서 key.snk 파일을 찾을 수 있습니다(<디스크 위치>\MyProjectTemplate\MyProjectWizard\key.snk). key.snk 파일을 복사합니다.

  7. 출력 디렉터리로 이동하여 어셈블리를 찾습니다(<디스크 위치>\MyProjectTemplate/MyProjectWizard\bin\Debug\MyProjectWizard.dll). 여기에 key.snk 파일을 붙여넣습니다. (반드시 필요한 것은 아니지만 다음 단계를 더 쉽게 수행할 수 있습니다.)

  8. 명령 창을 열고 어셈블리가 생성된 디렉터리로 변경합니다.

  9. sn.exe 서명 도구를 찾습니다. 예를 들어 Windows 10 64비트 운영 체제에서 일반적인 경로는 다음과 같습니다.

    C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools

    도구를 찾을 수 없으면 명령 창에서 where /R . sn.exe를 실행해봅니다. 경로를 기록해 둡니다.

  10. key.snk 파일에서 공개 키를 추출합니다. 명령 창에서 다음을 입력합니다.

    <sn.exe 위치>\sn.exe -p key.snk outfile.key.

    디렉터리 이름에 공백이 있으면 sn.exe 경로를 따옴표로 묶어야 합니다.

  11. outfile에서 공개 키 토큰을 가져옵니다.

    <sn.exe 위치>\sn.exe -t outfile.key.

    다시 말하지만, 따옴표로 묶어야 합니다. 출력에 다음과 같은 줄이 표시됩니다.

    공개 키 토큰은 <token>입니다.

    이 값을 기록해 둡니다.

  12. 프로젝트 템플릿의 .vstemplate 파일에 사용자 지정 마법사에 대한 참조를 추가합니다. 솔루션 탐색기에서 MyProjectTemplate.vstemplate이라는 파일을 찾아서 엽니다. <TemplateContent> 섹션 끝에 다음 섹션을 추가합니다.

    <WizardExtension>
        <Assembly>MyProjectWizard, Version=1.0.0.0, Culture=Neutral, PublicKeyToken=token</Assembly>
        <FullClassName>MyProjectWizard.WizardImplementation</FullClassName>
    </WizardExtension>
    

    여기서 MyProjectWizard는 어셈블리 이름이고 token은 이전 단계에서 복사한 토큰입니다.

  13. 프로젝트에서 모든 파일을 저장하고 다시 빌드합니다.

템플릿에 사용자 지정 매개 변수 추가

이 예제에서 템플릿으로 사용되는 프로젝트는 사용자 지정 마법사의 사용자 입력 양식에 지정된 메시지를 표시합니다.

  1. 솔루션 탐색기에서 MyProjectTemplate 프로젝트로 이동하고 Class1.cs를 엽니다.

  2. 애플리케이션의 Main 메서드에 다음 코드 줄을 추가합니다.

    Console.WriteLine("$custommessage$");
    

    $custommessage$ 매개 변수는 템플릿에서 프로젝트가 생성될 때 사용자 입력 양식에 입력된 텍스트로 바뀝니다.

다음은 템플릿으로 내보내기 전의 전체 코드 파일입니다.

using System;
using System.Collections.Generic;
$if$ ($targetframeworkversion$ >= 3.5)using System.Linq;
$endif$using System.Text;

namespace $safeprojectname$
{
    public class Class1
    {
          static void Main(string[] args)
          {
               Console.WriteLine("$custommessage$");
          }
    }
}

사용자 지정 마법사 사용

이제 템플릿에서 프로젝트를 만들고 사용자 지정 마법사를 사용할 수 있습니다.

  1. 솔루션을 다시 빌드하고 디버깅을 시작합니다. Visual Studio의 두 번째 인스턴스가 나타납니다.

  2. 새 MyProjectTemplate 프로젝트를 만듭니다. (파일>새로 만들기>프로젝트).

  3. 새 프로젝트 대화 상자에서 "myproject"를 검색하여 템플릿을 찾고, 이름을 입력하고, 확인을 클릭합니다.

    마법사 사용자 입력 양식이 열립니다.

  4. 사용자 지정 매개 변수의 값을 입력하고 단추를 클릭합니다.

    마법사 사용자 입력 양식이 닫히고 템플릿에서 프로젝트가 생성됩니다.

  5. 솔루션 탐색기에서 원본 코드 파일을 마우스 오른쪽 단추로 클릭하고 코드 보기를 클릭합니다.

    $custommessage$가 마법사 사용자 입력 양식에 입력된 텍스트로 바뀐 것을 확인할 수 있습니다.