다음을 통해 공유


기본 프로젝트 시스템 만들기, 1부

Visual Studio에서 프로젝트는 개발자가 소스 코드 파일 및 기타 자산을 구성하는 데 사용하는 컨테이너입니다. 프로젝트는 솔루션 탐색기 솔루션의 자식으로 표시됩니다. 프로젝트를 사용하면 소스 코드를 구성, 빌드, 디버그, 배포하고 웹 서비스, 데이터베이스, 기타 리소스에 대한 참조를 만들 수 있습니다.

프로젝트는 프로젝트 파일(예: Visual C# 프로젝트에 대한 .csproj 파일)에 정의됩니다. 고유한 프로젝트 파일 이름 확장명을 포함하는 고유한 프로젝트 형식을 만들 수 있습니다. 프로젝트 형식에 대한 자세한 내용은 프로젝트 형식을 참조하세요.

참고 항목

사용자 지정 프로젝트 형식으로 Visual Studio를 확장해야 하는 경우 프로젝트 시스템을 처음부터 빌드하는 것보다 많은 이점이 있는 VSPS(Visual Studio 프로젝트 시스템)를 활용하는 것이 좋습니다.

  • 더 쉽게 온보딩할 수 있습니다. 기본적인 프로젝트 시스템조차 수만 줄의 코드가 필요합니다. VSPS를 활용하면 필요에 맞게 사용자 지정할 준비가 되기 전에 몇 번의 클릭으로 온보딩 비용을 줄일 수 있습니다.

  • 유지 관리가 더 간편합니다. VSPS를 활용하여 사용자 고유의 시나리오만 유지 관리하면 됩니다. 모든 프로젝트 시스템 인프라의 유지 관리를 처리합니다.

    Visual Studio 2013 이전 버전의 Visual Studio를 대상으로 지정해야 하는 경우 Visual Studio 확장에서 VSPS를 활용할 수 없습니다. 이 경우 이 연습을 시작하는 것이 좋습니다.

이 연습에서는 프로젝트 파일 이름 확장명 .myproj가 있는 프로젝트 형식을 만드는 방법을 보여 줍니다. 이 연습은 기존 Visual C# 프로젝트 시스템에서 차용합니다.

참고 항목

확장 프로젝트의 더 많은 예제는 VSSDK 샘플을 참조하세요.

이 연습에서는 다음 작업을 수행하는 방법을 설명합니다.

  • 기본 프로젝트 형식을 만듭니다.

  • 기본 프로젝트 템플릿을 만듭니다.

  • Visual Studio에 프로젝트 템플릿을 등록합니다.

  • 새 프로젝트 대화 상자를 연 다음 템플릿을 사용하여 프로젝트 인스턴스를 만듭니다.

  • 프로젝트 시스템에 대한 프로젝트 팩터리를 만듭니다.

  • 프로젝트 시스템에 대한 프로젝트 노드를 만듭니다.

  • 프로젝트 시스템에 대한 사용자 지정 아이콘을 추가합니다.

  • 기본 템플릿 매개 변수 대체를 구현합니다.

필수 조건

프로젝트용 관리되는 패키지 프레임워크의 소스 코드를 다운로드합니다. 만들려는 솔루션에 액세스할 수 있는 위치에 파일을 추출합니다.

기본 프로젝트 형식 만들기

SimpleProject라는 C# VSIX 프로젝트를 만듭니다. (파일>>프로젝트Visual C#>확장성>VSIX 프로젝트). Visual Studio 패키지 프로젝트 항목 템플릿을 추가합니다(솔루션 탐색기 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 새 항목>추가를 선택한 다음, 확장성>Visual Studio 패키지로 이동). 파일 이름을 SimpleProjectPackage로 지정합니다.

기본 프로젝트 템플릿 만들기

이제 이 기본 VSPackage를 수정하여 새로운 .myproj 프로젝트 형식을 구현할 수 있습니다. .myproj 프로젝트 형식을 기반으로 하는 프로젝트를 만들려면 Visual Studio에서 새 프로젝트에 추가할 파일, 리소스 및 참조를 알아야 합니다. 이 정보를 제공하려면 프로젝트 파일을 프로젝트 템플릿 폴더에 배치합니다. 사용자가 .myproj 프로젝트를 사용하여 프로젝트를 만들면 파일이 새 프로젝트에 복사됩니다.

기본 프로젝트 템플릿을 만들려면 다음을 수행합니다.

  1. 프로젝트에 세 개의 폴더를 아래에 하나씩 추가합니다(Templates\Projects\SimpleProject). (솔루션 탐색기에서 SimpleProject 프로젝트 노드를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 새 폴더를 클릭합니다. 폴더 이름을 Templates로 지정합니다. Templates 폴더에 Projects라는 폴더를 추가합니다. Projects 폴더에 SimpleProject라는 폴더를 추가합니다.)

  2. Templates\Projects\SimpleProject 폴더에서 SimpleProject.ico라는 아이콘으로 사용할 비트맵 이미지 파일을 추가합니다. 추가를 클릭하면 아이콘 편집기가 열립니다.

  3. 아이콘을 고유하게 만듭니다. 이 아이콘은 연습의 뒷부분에 있는 새 프로젝트 대화 상자에 표시됩니다.

    Simple Project Icon

  4. 아이콘을 저장하고 아이콘 편집기를 닫습니다.

  5. Templates\Projects\SimpleProject 폴더에서 Program.cs라는 Class 항목을 추가합니다.

  6. 기존 코드를 다음 줄로 바꿉니다.

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace $nameSpace$
    {
        public class $className$
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello VSX!!!");
                Console.ReadKey();
            }
        }
    }
    

    Important

    이것은 Program.cs 코드의 최종 형식이 아닙니다. 대체 매개 변수는 이후 단계에서 처리됩니다. 컴파일 오류가 표시될 수 있지만 파일의 BuildActionContent라면 평소와 같이 프로젝트를 빌드하고 실행할 수 있습니다.

  7. 파일을 저장합니다.

  8. Properties 폴더에서 AssemblyInfo.cs 파일을 Projects\SimpleProject 폴더로 복사합니다.

  9. Projects\SimpleProject 폴더에 SimpleProject.myproj라는 XML 파일을 추가합니다.

    참고 항목

    이 형식의 모든 프로젝트에 대한 파일 이름 확장명은 .myproj입니다. 변경하려면 연습에서 언급된 모든 위치에서 변경해야 합니다.

  10. 기존 내용을 다음 줄로 바꿉니다.

    <?xml version="1.0" encoding="utf-8" ?>
    <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
      <PropertyGroup>
        <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
        <SchemaVersion>2.0</SchemaVersion>
        <ProjectGuid></ProjectGuid>
        <OutputType>Exe</OutputType>
        <RootNamespace>MyRootNamespace</RootNamespace>
        <AssemblyName>MyAssemblyName</AssemblyName>
        <EnableUnmanagedDebugging>false</EnableUnmanagedDebugging>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
        <DebugSymbols>true</DebugSymbols>
        <OutputPath>bin\Debug\</OutputPath>
      </PropertyGroup>
      <PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
        <DebugSymbols>false</DebugSymbols>
        <OutputPath>bin\Release\</OutputPath>
      </PropertyGroup>
      <ItemGroup>
        <Reference Include="mscorlib" />
        <Reference Include="System" />
        <Reference Include="System.Data" />
        <Reference Include="System.Xml" />
      </ItemGroup>
      <ItemGroup>
        <Compile Include="AssemblyInfo.cs">
          <SubType>Code</SubType>
        </Compile>
        <Compile Include="Program.cs">
          <SubType>Code</SubType>
        </Compile>
      </ItemGroup>
      <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
    </Project>
    
  11. 파일을 저장합니다.

  12. 속성 창에서 AssemblyInfo.cs, Program.cs, SimpleProject.icoBuild Action을 설정합니다. SimpleProject.myprojContent로 변경하고 Include in VSIX 속성을 True로 설정합니다.

    이 프로젝트 템플릿은 디버그 구성과 릴리스 구성을 모두 포함하는 기본 Visual C# 프로젝트에 대해 설명합니다. 이 프로젝트에는 AssemblyInfo.csProgram.cs라는 두 원본 파일과 여러 어셈블리 참조가 포함됩니다. 템플릿에서 프로젝트를 만들면 ProjectGuid 값이 자동으로 새 GUID로 대체됩니다.

    솔루션 탐색기에서 확장된 Templates 폴더는 다음과 같이 표시되어야 합니다.

Templates
   Projects
      SimpleProject
         AssemblyInfo.cs
         Program.cs
         SimpleProject.ico
         SimpleProject.myproj

기본 프로젝트 팩터리 만들기

Visual Studio에 프로젝트 템플릿 폴더의 위치를 알려야 합니다. 이렇게 하려면 VSPackage를 빌드할 때 템플릿 위치가 시스템 레지스트리에 기록되도록 프로젝트 팩터리를 구현하는 VSPackage 클래스에 특성을 추가합니다. 먼저 프로젝트 팩터리 GUID로 식별되는 기본 프로젝트 팩터리를 만듭니다. ProvideProjectFactoryAttribute 속성을 사용하여 프로젝트 팩터리를 SimpleProjectPackage 클래스에 연결합니다.

기본 프로젝트 팩터리를 만들려면

  1. 프로젝트 팩터리에 대한 GUID를 만들거나(도구 메뉴에서 GUID 만들기 클릭) 다음 예제의 GUID를 사용합니다. 이미 정의된 PackageGuidString이 있는 섹션 근처의 SimpleProjectPackage 클래스에 GUID를 추가합니다. GUID는 GUID 형식과 문자열 형식이어야 합니다. 결과 코드는 다음 예제와 유사합니다.

        public sealed class SimpleProjectPackage : Package
        {
            ...
            public const string SimpleProjectPkgString = "96bf4c26-d94e-43bf-a56a-f8500b52bfad";
            public const string SimpleProjectFactoryString = "471EC4BB-E47E-4229-A789-D1F5F83B52D4";
    
            public static readonly Guid guidSimpleProjectFactory = new Guid(SimpleProjectFactoryString);
        }
    
  2. SimpleProjectFactory.cs라는 이름의 최상위 SimpleProject 폴더에 클래스를 추가합니다.

  3. 다음 using 지시문을 추가합니다.

    using System.Runtime.InteropServices;
    using Microsoft.VisualStudio.Shell;
    
  4. SimpleProjectFactory 클래스에 GUID 속성을 추가합니다. 특성 값은 새 프로젝트 팩터리 GUID입니다.

    [Guid(SimpleProjectPackage.SimpleProjectFactoryString)]
    class SimpleProjectFactory
    {
    }
    

    이제 프로젝트 템플릿을 등록할 수 있습니다.

프로젝트 템플릿을 등록하려면

  1. SimpleProjectPackage.cs에서 다음과 같이 SimpleProjectPackage 클래스에 ProvideProjectFactoryAttribute 특성을 추가합니다.

    [ProvideProjectFactory(    typeof(SimpleProjectFactory),     "Simple Project",
        "Simple Project Files (*.myproj);*.myproj", "myproj", "myproj",
        @"Templates\Projects\SimpleProject",     LanguageVsTemplate = "SimpleProject")]
    [Guid(SimpleProjectPackage.PackageGuidString)]
    public sealed class SimpleProjectPackage : Package
    
  2. 솔루션을 다시 빌드하고 오류 없이 빌드되는지 확인합니다.

    다시 빌드하면 프로젝트 템플릿이 등록됩니다.

    매개 변수 defaultProjectExtensionpossibleProjectExtensions는 프로젝트 파일 이름 확장명(.myproj)으로 설정됩니다. projectTemplatesDirectory 매개 변수는 Templates 폴더의 상대 경로로 설정됩니다. 빌드하는 동안 이 경로는 전체 빌드로 변환되고 레지스트리에 추가되어 프로젝트 시스템을 등록합니다.

템플릿 등록 테스트

템플릿 등록은 Visual Studio가 새 프로젝트 대화 상자에 템플릿 이름과 아이콘을 표시할 수 있도록 프로젝트 템플릿 폴더의 위치를 Visual Studio에 알려줍니다.

템플릿 등록을 테스트하려면

  1. F5 키를 눌러 Visual Studio의 실험적 인스턴스 디버깅을 시작합니다.

  2. 실험적 인스턴스에서 새로 만든 프로젝트 형식의 새 프로젝트를 만듭니다. 새 프로젝트 대화 상자의 설치된 템플릿 아래에 SimpleProject가 표시되어야 합니다.

    이제 등록된 프로젝트 팩터리가 있습니다. 그러나 아직 프로젝트를 만들 수 없습니다. 프로젝트 패키지와 프로젝트 팩터리는 함께 작동하여 프로젝트를 만들고 초기화합니다.

관리 패키지 프레임워크 코드 추가

프로젝트 패키지와 프로젝트 팩터리 간의 연결을 구현합니다.

  • 관리 패키지 프레임워크에 대한 소스 코드 파일을 가져옵니다.

    1. SimpleProject 프로젝트를 언로드하고(솔루션 탐색기에서 프로젝트 노드를 선택하고 컨텍스트 메뉴에서 프로젝트 언로드를 클릭) XML 편집기에서 프로젝트 파일을 엽니다.

    2. 프로젝트 파일에 다음 블록을 추가합니다(<가져오기> 블록 바로 위). 방금 다운로드한 Managed Package Framework 코드에서 ProjectBase.files 파일의 위치로 ProjectBasePath를 설정합니다. 경로 이름에 백슬래시를 추가해야 할 수 있습니다. 그렇지 않으면 프로젝트에서 관리 패키지 프레임워크 소스 코드를 찾지 못할 수 있습니다.

      <PropertyGroup>
           <ProjectBasePath>your path here\</ProjectBasePath>
           <RegisterWithCodebase>true</RegisterWithCodebase>
        </PropertyGroup>
        <Import Project="$(ProjectBasePath)\ProjectBase.Files" />
      

      Important

      경로 끝에 백슬래시를 반드시 입력하세요.

    3. 프로젝트를 다시 로드합니다.

    4. 다음 어셈블리에 대한 참조를 추가합니다.

      • Microsoft.VisualStudio.Designer.Interfaces(<VSSDK 설치>\VisualStudioIntegration\Common\Assemblies\v2.0)

      • WindowsBase

      • Microsoft.Build.Tasks.v4.0

프로젝트 팩터리를 초기화하려면

  1. SimpleProjectPackage.cs 파일에서 다음 using 지시문을 추가합니다.

    using Microsoft.VisualStudio.Project;
    
  2. Microsoft.VisualStudio.Package.ProjectPackage에서 SimpleProjectPackage 클래스를 파생합니다.

    public sealed class SimpleProjectPackage : ProjectPackage
    
  3. 프로젝트 팩터리를 등록합니다. base.Initialize 바로 뒤에 SimpleProjectPackage.Initialize 메서드에 다음 줄을 추가합니다.

    base.Initialize();
    this.RegisterProjectFactory(new SimpleProjectFactory(this));
    
  4. 추상 속성 ProductUserContext를 구현합니다.

    public override string ProductUserContext
        {
            get { return ""; }
    }
    
  5. SimpleProjectFactory.cs에서 기존 using 지시문 뒤에 다음 using 지시문을 추가합니다.

    using Microsoft.VisualStudio.Project;
    
  6. ProjectFactory에서 SimpleProjectFactory 클래스를 파생합니다.

    class SimpleProjectFactory : ProjectFactory
    
  7. 다음 더미 메서드를 SimpleProjectFactory 클래스에 추가합니다. 이후 섹션에서 이 메서드를 구현합니다.

    protected override ProjectNode CreateProject()
    {
        return null;
    }
    
  8. 다음 필드와 생성자를 SimpleProjectFactory 클래스에 추가합니다. 이 SimpleProjectPackage 참조는 서비스 공급자 사이트를 설정하는 데 사용할 수 있도록 프라이빗 필드에 캐시됩니다.

    private SimpleProjectPackage package;
    
    public SimpleProjectFactory(SimpleProjectPackage package)
        : base(package)
    {
        this.package = package;
    }
    
  9. 솔루션을 다시 빌드하고 오류 없이 빌드되는지 확인합니다.

프로젝트 팩터리 구현 테스트

프로젝트 팩터리 구현에 대한 생성자가 호출되는지 여부를 테스트합니다.

프로젝트 팩터리 구현을 테스트하려면

  1. SimpleProjectFactory.cs 파일에서 SimpleProjectFactory 생성자의 다음 줄에 중단점을 설정합니다.

    this.package = package;
    
  2. F5 키를 눌러 Visual Studio의 실험적 인스턴스를 시작합니다.

  3. 실험적 인스턴스에서 새 프로젝트를 만들기 시작합니다. 새 프로젝트 대화 상자에서 SimpleProject 프로젝트 형식을 선택한 다음 확인을 클릭합니다. 중단점에서 실행이 중지됩니다.

  4. 중단점을 지우고 디버깅을 중지합니다. 아직 프로젝트 노드를 만들지 않았으므로 프로젝트 만들기 코드는 여전히 예외를 throw합니다.

ProjectNode 클래스 확장

이제 ProjectNode 클래스에서 파생된 SimpleProjectNode 클래스를 구현할 수 있습니다. ProjectNode 기본 클래스는 다음과 같은 프로젝트 생성 작업을 처리합니다.

  • 프로젝트 템플릿 파일 SimpleProject.myproj를 새 프로젝트 폴더에 복사합니다. 새 프로젝트 대화 상자에 입력한 이름에 따라 복사본의 이름이 바뀝니다. ProjectGuid 속성 값은 새 GUID로 대체됩니다.

  • 프로젝트 템플릿 파일 SimpleProject.myproj의 MSBuild 요소를 탐색하고 Compile 요소를 찾습니다. 각 Compile 대상 파일에 대해 파일을 새 프로젝트 폴더에 복사합니다.

    파생된 SimpleProjectNode 클래스는 다음 작업을 처리합니다.

  • 솔루션 탐색기에서 프로젝트 및 파일 노드의 아이콘을 만들거나 선택할 수 있습니다.

  • 추가 프로젝트 템플릿 매개 변수 대체를 지정할 수 있습니다.

ProjectNode 클래스를 확장하려면

  1. SimpleProjectNode.cs라는 클래스를 추가합니다.

  2. 기존 코드를 다음 코드로 바꿉니다.

    using System;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.Project;
    
    namespace SimpleProject
    {
        public class SimpleProjectNode : ProjectNode
        {
            private SimpleProjectPackage package;
    
            public SimpleProjectNode(SimpleProjectPackage package)
            {
                this.package = package;
            }
            public override Guid ProjectGuid
            {
                get { return SimpleProjectPackage.guidSimpleProjectFactory; }
            }
            public override string ProjectType
            {
                get { return "SimpleProjectType"; }
            }
    
            public override void AddFileFromTemplate(
                string source, string target)
            {
                this.FileTemplateProcessor.UntokenFile(source, target);
                this.FileTemplateProcessor.Reset();
            }
        }
    }
    

    SimpleProjectNode 클래스 구현에는 재정의된 메서드가 있습니다.

  • ProjectGuid는 프로젝트 팩터리 GUID를 반환합니다.

  • ProjectType은 프로젝트 형식의 지역화된 이름을 반환합니다.

  • AddFileFromTemplate은 템플릿 폴더에서 대상 프로젝트로 선택한 파일을 복사합니다. 이 메서드는 이후 섹션에서 추가로 구현됩니다.

    SimpleProjectFactory 생성자처럼 SimpleProjectNode 생성자는 나중에 사용할 수 있도록 비공개 필드에 SimpleProjectPackage 참조를 캐시합니다.

    SimpleProjectFactory 클래스를 SimpleProjectNode 클래스에 연결하려면 SimpleProjectFactory.CreateProject 메서드에서 새 SimpleProjectNode을 인스턴스화하고 나중에 사용할 수 있도록 프라이빗 필드에 캐시해야 합니다.

프로젝트 팩터리 클래스와 노드 클래스를 연결하려면

  1. SimpleProjectFactory.cs 파일에서 다음 using 지시문을 추가합니다.

    using IOleServiceProvider =    Microsoft.VisualStudio.OLE.Interop.IServiceProvider;
    
  2. 다음 코드를 사용하여 SimpleProjectFactory.CreateProject 메서드를 바꿉니다.

    protected override ProjectNode CreateProject()
    {
        SimpleProjectNode project = new SimpleProjectNode(this.package);
    
        project.SetSite((IOleServiceProvider)        ((IServiceProvider)this.package).GetService(            typeof(IOleServiceProvider)));
        return project;
    }
    
  3. 솔루션을 다시 빌드하고 오류 없이 빌드되는지 확인합니다.

ProjectNode 클래스 테스트

프로젝트 팩터리를 테스트하여 프로젝트 계층 구조를 만드는지 확인합니다.

ProjectNode 클래스를 테스트하려면

  1. F5 키를 눌러 디버깅을 시작합니다. 실험적 인스턴스에서 새 SimpleProject를 만듭니다.

  2. Visual Studio는 프로젝트 팩터리를 호출하여 프로젝트를 만들어야 합니다.

  3. Visual Studio의 실험적 인스턴스를 닫습니다.

사용자 지정 프로젝트 노드 아이콘 추가

이전 섹션의 프로젝트 노드 아이콘은 기본 아이콘입니다. 이를 사용자 지정 아이콘으로 변경할 수 있습니다.

사용자 지정 프로젝트 노드 아이콘을 추가하려면

  1. Resources 폴더에 SimpleProjectNode.bmp라는 비트맵 파일을 추가합니다.

  2. 속성 창에서 비트맵을 16x16픽셀로 줄입니다. 비트맵을 고유하게 만듭니다.

    Simple Project Comm

  3. 속성 창에서 비트맵의 빌드 작업포함 리소스로 변경합니다.

  4. SimpleProjectNode.cs에서 다음 using 지시문을 추가합니다.

    using System.Drawing;
    using System.Windows.Forms;
    
  5. 다음 정적 필드 및 생성자를 SimpleProjectNode 클래스에 추가합니다.

    private static ImageList imageList;
    
    static SimpleProjectNode()
    {
        imageList =        Utilities.GetImageList(            typeof(SimpleProjectNode).Assembly.GetManifestResourceStream(                "SimpleProject.Resources.SimpleProjectNode.bmp"));
    }
    
  6. SimpleProjectNode 클래스의 시작 부분에 다음 속성을 추가합니다.

    internal static int imageIndex;
       public override int ImageIndex
       {
           get { return imageIndex; }
       }
    
  7. 인스턴스 생성자를 다음 코드로 바꿉니다.

    public SimpleProjectNode(SimpleProjectPackage package)
    {
        this.package = package;
    
        imageIndex = this.ImageHandler.ImageList.Images.Count;
    
        foreach (Image img in imageList.Images)
        {
            this.ImageHandler.AddImage(img);
        }
    }
    

    정적 구성 중에 SimpleProjectNode는 어셈블리 매니페스트 리소스에서 프로젝트 노드 비트맵을 검색하고 나중에 사용할 수 있도록 프라이빗 필드에 캐시합니다. GetManifestResourceStream 이미지 경로의 구문을 확인하세요. 어셈블리에 포함된 매니페스트 리소스의 이름을 보려면 GetManifestResourceNames 메서드를 사용합니다. 이 메서드를 SimpleProject 어셈블리에 적용하면 결과는 다음과 같아야 합니다.

  • SimpleProject.Resources.resources

  • VisualStudio.Project.resources

  • SimpleProject.VSPackage.resources

  • Resources.imagelis.bmp

  • Microsoft.VisualStudio.Project.DontShowAgainDialog.resources

  • Microsoft.VisualStudio.Project.SecurityWarningDialog.resources

  • SimpleProject.Resources.SimpleProjectNode.bmp

    인스턴스 생성 중에 ProjectNode 기본 클래스는 Resources\imagelis.bmp에서 일반적으로 사용되는 16x16 비트맵이 포함된 Resources.imagelis.bmp를 로드합니다. 이 비트맵 목록은 SimpleProjectNode에서 ImageHandler.ImageList로 사용할 수 있습니다. SimpleProjectNode는 프로젝트 노드 비트맵을 목록에 추가합니다. 이미지 목록에 있는 프로젝트 노드 비트맵의 오프셋은 나중에 퍼블릭 ImageIndex 속성 값으로 사용할 수 있도록 캐시됩니다. Visual Studio는 이 속성을 사용하여 프로젝트 노드 아이콘으로 표시할 비트맵을 결정합니다.

사용자 지정 프로젝트 노드 테스트 아이콘

프로젝트 팩터리를 테스트하여 사용자 지정 프로젝트 노드 아이콘이 있는 프로젝트 계층 구조를 만드는지 확인합니다.

사용자 지정 프로젝트 노드 아이콘을 테스트하려면

  1. 디버깅을 시작하고 실험적 인스턴스에서 새 SimpleProject를 만듭니다.

  2. 새로 만든 프로젝트에서 SimpleProjectNode.bmp가 프로젝트 노드 아이콘으로 사용됩니다.

    Simple Project New Project Node

  3. 코드 편집기에서 Program.cs를 엽니다. 다음 코드와 유사한 소스 코드가 표시됩니다.

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace $nameSpace$
    {
        public class $className$
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello VSX!!!");
                Console.ReadKey();
            }
        }
    }
    

    템플릿 매개 변수 $nameSpace$ 및 $className$에는 새 값이 없습니다. 다음 섹션에서 템플릿 매개 변수 대체를 구현하는 방법을 알아봅니다.

대체 템플릿 매개 변수

이전 섹션에서는 ProvideProjectFactory 특성을 사용하여 Visual Studio에 프로젝트 템플릿을 등록했습니다. 이러한 방식으로 템플릿 폴더의 경로를 등록하면 ProjectNode.AddFileFromTemplate 클래스를 재정의 및 확장하여 기본 템플릿 매개 변수 대체를 활성화할 수 있습니다. 자세한 내용은 새 프로젝트 생성: 내부, 2부를 참조하세요.

이제 AddFileFromTemplate 클래스에 대체 코드를 추가합니다.

템플릿 매개 변수를 대체하려면

  1. SimpleProjectNode.cs 파일에서 다음 using 지시문을 추가합니다.

    using System.IO;
    
  2. 다음 코드를 사용하여 AddFileFromTemplate 메서드를 바꿉니다.

    public override void AddFileFromTemplate(
        string source, string target)
    {
        string nameSpace =
            this.FileTemplateProcessor.GetFileNamespace(target, this);
        string className = Path.GetFileNameWithoutExtension(target);
    
        this.FileTemplateProcessor.AddReplace("$nameSpace$", nameSpace);
        this.FileTemplateProcessor.AddReplace("$className$", className);
    
        this.FileTemplateProcessor.UntokenFile(source, target);
        this.FileTemplateProcessor.Reset();
    }
    
  3. 메서드에서 className 대입문 바로 뒤에 중단점을 설정합니다.

    이 대입문은 네임스페이스와 새 클래스 이름에 대한 합리적인 값을 결정합니다. 두 개의 ProjectNode.FileTemplateProcessor.AddReplace 메서드 호출은 이러한 새 값을 사용하여 해당 템플릿 매개 변수 값을 대체합니다.

템플릿 매개 변수 대체 테스트

이제 템플릿 매개 변수 대체를 테스트할 수 있습니다.

템플릿 매개 변수 대체를 테스트하려면

  1. 디버깅을 시작하고 실험적 인스턴스에서 새 SimpleProject를 만듭니다.

  2. AddFileFromTemplate 메서드의 중단점에서 실행이 중지됩니다.

  3. nameSpaceclassName 매개 변수의 값을 검사합니다.

    • nameSpace에는 \Templates\Projects\SimpleProject\SimpleProject.myproj 프로젝트 템플릿 파일의 <RootNamespace> 요소 값이 지정됩니다. 이 경우 값은 MyRootNamespace가 됩니다.

    • className에는 파일 이름 확장명 없이 클래스 원본 파일 이름 값이 지정됩니다. 이 경우 대상 폴더에 복사할 첫 번째 파일은 AssemblyInfo.cs입니다. 따라서 className의 값은 AssemblyInfo입니다.

  4. 중단점을 제거하고 F5 키를 눌러 실행을 계속합니다.

    Visual Studio에서 프로젝트 만들기를 완료해야 합니다.

  5. 코드 편집기에서 Program.cs를 엽니다. 다음 코드와 유사한 소스 코드가 표시됩니다.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace MyRootNamespace
    {
        public class Program
        {
            static void Main(string[] args)
            {
                Console.WriteLine("Hello VSX!!!");
                Console.ReadKey();
            }
        }
    }
    

    네임스페이스는 이제 MyRootNamespace이고 클래스 이름은 이제 Program입니다.

  6. 프로젝트 디버깅을 시작합니다. 새 프로젝트는 콘솔 창에서 “Hello VSX!!!”를 컴파일, 실행하고 표시해야 합니다.

    Simple Project Command

    축하합니다! 기본 관리 프로젝트 시스템을 구현했습니다.