이 시리즈의 첫 번째 연습인 기본 프로젝트 시스템 만들기 1부에서는 기본 프로젝트 시스템을 만드는 방법을 보여 줍니다. 이 가이드는 기본 프로젝트 시스템을 확장하여 Visual Studio 템플릿, 속성 페이지 및 기타 기능을 추가합니다. 이 연습을 시작하기 전에 첫 번째 연습을 완료해야 합니다.
이 연습에서는 프로젝트 파일 이름 확장명 .myproj가 있는 프로젝트 형식을 만드는 방법을 보여 줍니다. 연습을 완료하려면 연습이 기존 Visual C# 프로젝트 시스템에서 차용되므로 고유한 언어를 만들 필요가 없습니다.
이 안내서에서는 다음 작업을 수행하는 방법을 알려줍니다.
Visual Studio 템플릿을 만듭니다.
Visual Studio 템플릿을 배포합니다.
새 프로젝트 대화 상자에서 프로젝트 형식 자식 노드 를 만듭니다.
Visual Studio 템플릿에서 매개 변수 대체를 사용하도록 설정합니다.
프로젝트 속성 페이지를 만듭니다.
비고
이 연습의 단계는 C# 프로젝트를 기반으로 합니다. 그러나 파일 이름 확장명 및 코드와 같은 세부 사항을 제외하고 Visual Basic 프로젝트에 대해 동일한 단계를 사용할 수 있습니다.
Visual Studio 템플릿 만들기
- 기본 프로젝트 시스템을 만들고, 1부 에서는 기본 프로젝트 템플릿을 만들고 프로젝트 시스템에 추가하는 방법을 보여 있습니다. 또한 시스템 레지스트리에서 ProvideProjectFactoryAttribute 폴더의 전체 경로를 작성하는 특성을 사용하여 Visual Studio에 이 템플릿을 등록하는 방법을 보여 줍니다.
기본 프로젝트 템플릿 대신 Visual Studio 템플릿(.vstemplate 파일)을 사용하면 새 프로젝트 대화 상자에 템플릿이 표시되는 방법과 템플릿 매개 변수를 대체하는 방법을 제어할 수 있습니다. .vstemplate 파일은 프로젝트 시스템 템플릿을 사용하여 프로젝트를 만들 때 원본 파일을 포함하는 방법을 설명하는 XML 파일입니다. 프로젝트 시스템 자체는 .vstemplate 파일 및 소스 파일을 .zip 파일에 수집하여 빌드되고 .zip 파일을 Visual Studio에 알려진 위치에 복사하여 배포됩니다. 이 프로세스는 이 연습의 뒷부분에서 자세히 설명합니다.
Visual Studio에서 기본 프로젝트 시스템 만들기( 1부)에 따라 만든 SimpleProject 솔루션을 엽니다.
SimpleProjectPackage.cs 파일에서 ProvideProjectFactory 특성을 찾습니다. 두 번째 매개 변수(프로젝트 이름)를 null로 바꾸고 네 번째 매개 변수(프로젝트 템플릿 폴더의 경로)를 다음과 같이 ".\\NullPath"로 바꿉니다.
[ProvideProjectFactory(typeof(SimpleProjectFactory), null, "Simple Project Files (*.myproj);*.myproj", "myproj", "myproj", ".\\NullPath", LanguageVsTemplate = "SimpleProject")]SimpleProject.vstemplate이라는 XML 파일을 \Templates\Projects\SimpleProject\ 폴더에 추가합니다.
SimpleProject.vstemplate의 내용을 다음 코드로 바꿉니다.
<VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"> <TemplateData> <Name>SimpleProject Application</Name> <Description> A project for creating a SimpleProject application </Description> <Icon>SimpleProject.ico</Icon> <ProjectType>SimpleProject</ProjectType> </TemplateData> <TemplateContent> <Project File="SimpleProject.myproj" ReplaceParameters="true"> <ProjectItem ReplaceParameters="true" OpenInEditor="true"> Program.cs </ProjectItem> <ProjectItem ReplaceParameters="true" OpenInEditor="false"> AssemblyInfo.cs </ProjectItem> </Project> </TemplateContent> </VSTemplate>속성 창에서 \Templates\Projects\SimpleProject\ 폴더의 5개 파일을 모두 선택하고 빌드 작업을ZipProject로 설정합니다.
TemplateData 섹션은 <다음과 같이 > 대화 상자에서 SimpleProject 프로젝트 형식의 위치와 모양을 결정합니다.
<Name> 요소는 프로젝트 템플릿의 이름을 SimpleProject 애플리케이션으로 지정합니다.
<Description> 요소에는 프로젝트 템플릿을 선택할 때 새 프로젝트 대화 상자에 표시되는 설명이 포함됩니다.
<Icon> 요소는 SimpleProject 프로젝트 형식과 함께 표시되는 아이콘을 지정합니다.
<ProjectType> 요소는 새 프로젝트 대화 상자에서 프로젝트 형식의 이름을 지정합니다. 이 이름은 ProvideProjectFactory 특성의 프로젝트 이름 매개 변수를 대체합니다.
비고
<ProjectType> 요소는 SimpleProjectPackage.cs 파일에 있는 특성의
LanguageVsTemplate인수와 일치ProvideProjectFactory해야 합니다.TemplateContent< 섹션에서는 >새 프로젝트를 만들 때 생성되는 이러한 파일에 대해 설명합니다.
SimpleProject.myproj
Program.cs
AssemblyInfo.cs
세 파일 모두 true로 설정되었으므로
ReplaceParameters매개 변수를 대체할 수 있습니다. Program.cs 파일이 true로 설정되었OpenInEditor으므로 프로젝트를 만들 때 코드 편집기에서 파일이 열립니다.Visual Studio 템플릿 스키마의 요소에 대한 자세한 내용은 Visual Studio 템플릿 스키마 참조를 참조하세요.
비고
프로젝트에 둘 이상의 Visual Studio 템플릿이 있는 경우 모든 템플릿은 별도의 폴더에 있습니다. 해당 폴더의 모든 파일에는 빌드 작업이ZipProject로 설정되어 있어야 합니다.
최소 .vsct 파일 추가
새 또는 수정된 Visual Studio 템플릿을 인식하려면 설치 모드에서 Visual Studio를 실행해야 합니다. 설치 모드를 사용하려면 .vsct 파일이 있어야 합니다. 따라서 프로젝트에 최소 .vsct 파일을 추가해야 합니다.
SimpleProject.vsct라는 XML 파일을 SimpleProject 프로젝트에 추가합니다.
SimpleProject.vsct 파일의 내용을 다음 코드로 바꿉니다.
<?xml version="1.0" encoding="utf-8" ?> <CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable"> </CommandTable>이 파일의 빌드 작업을VSCTCompile로 설정합니다. 속성 창이 아닌 .csproj 파일에서만 이 작업을 수행할 수 있습니다. 이 파일의 빌드 동작 이 이 시점에서 None 으로 설정되어 있는지 확인합니다.
SimpleProject 노드를 마우스 오른쪽 단추로 클릭한 다음 SimpleProject.csproj 편집을 선택합니다.
.csproj 파일에서 SimpleProject.vsct 항목을 찾습니다.
<None Include="SimpleProject.vsct" />빌드 작업을 VSCTCompile로 변경합니다.
<VSCTCompile Include="SimpleProject.vsct" />프로젝트 파일을 열고 편집기를 닫습니다.
SimpleProject 노드를 저장한 다음 솔루션 탐색기 에서 프로젝트 다시 로드를 선택합니다.
Visual Studio 템플릿 빌드 단계 검사
VSPackage 프로젝트 빌드 시스템은 일반적으로 .vstemplate 파일이 변경되거나 .vstemplate 파일이 포함된 프로젝트를 다시 빌드할 때 설치 모드에서 Visual Studio를 실행합니다. MSBuild의 세부 정보 수준을 Normal 또는 그 이상으로 설정하여 따라 진행할 수 있습니다.
도구>옵션 창에서 모든 설정>프로젝트 및 솔루션> 섹션을 확장합니다.
MSBuild 프로젝트 빌드 출력 세부 정보 표시 옵션을 표준으로 설정합니다.
도구>옵션 대화 상자에서 프로젝트 및 솔루션> 섹션을 확장합니다.
MSBuild 프로젝트 빌드 출력 세부 정보 표시 옵션을 표준으로 설정하고 확인을 선택합니다.
- SimpleProject 프로젝트를 다시 빌드합니다.
.zip 프로젝트 파일을 만드는 빌드 단계는 다음 예제와 유사해야 합니다.
ZipProjects:
1> Zipping ProjectTemplates
1> Zipping <path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip...
1> Copying file from "<path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip" to "<%LOCALAPPDATA%>\Microsoft\VisualStudio\14.0Exp\ProjectTemplates\\\\SimpleProject.zip".
1> Copying file from "<path>\SimpleProject\SimpleProject\obj\Debug\SimpleProject.zip" to "bin\Debug\\ProjectTemplates\\\\SimpleProject.zip".
1> SimpleProject -> <path>\SimpleProject\SimpleProject\bin\Debug\ProjectTemplates\SimpleProject.zip
1>ZipItems:
1> Zipping ItemTemplates
1> SimpleProject ->
Visual Studio 템플릿 배포
Visual Studio 템플릿에는 경로 정보가 포함되어 있지 않습니다. 따라서 템플릿 .zip 파일을 Visual Studio에 알려진 위치에 배포해야 합니다. ProjectTemplates 폴더의 위치는 일반적으로 < \Microsoft\VisualStudio\14.0Exp\ProjectTemplates를%LOCALAPPDATA%>.
프로젝트 팩터리를 배포하려면 설치 프로그램에 관리자 권한이 있어야 합니다. Visual Studio 설치 노드 ...\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates 아래에 템플릿을 배포합니다.
Visual Studio 템플릿 테스트
Visual Studio 템플릿을 사용하여 프로젝트 계층 구조를 만드는지 여부를 확인하려면 프로젝트 팩터리를 테스트합니다.
Visual Studio SDK 실험적 인스턴스를 다시 설정합니다.
Windows 7: 시작 메뉴에서 Microsoft Visual Studio/Microsoft Visual Studio SDK/Tools 폴더를 찾은 다음 , Microsoft Visual Studio 실험적 인스턴스 다시 설정을 선택합니다.
이후 버전의 Windows: 시작 화면에서 Microsoft Visual Studio <버전> 실험 인스턴스 다시 설정을 입력합니다.
명령 프롬프트 창이 나타납니다. 계속하려면 아무 키나 누르는 단어가 표시되면 Enter 키를 선택합니다. 창이 닫히면 Visual Studio를 엽니다.
SimpleProject 프로젝트를 다시 빌드하고 디버깅을 시작합니다. 실험적 인스턴스가 나타납니다.
실험적 인스턴스에서 SimpleProject 프로젝트를 만듭니다. 새 프로젝트 대화 상자에서 SimpleProject를 선택합니다.
SimpleProject의 새 인스턴스가 표시됩니다.
프로젝트 형식 자식 노드 만들기
새 프로젝트 대화 상자에서 자식 노드를 프로젝트 형식 노드에 추가할 수 있습니다. 예를 들어 SimpleProject 프로젝트 형식의 경우 콘솔 애플리케이션, 창 애플리케이션, 웹 애플리케이션 등에 대한 자식 노드가 있을 수 있습니다.
자식 노드는 프로젝트 파일을 변경하고 OutputSubPath< 자식을 ZipProject> 요소에 <추가하여 >만듭니다. 빌드 또는 배포 중에 템플릿을 복사하면 모든 자식 노드가 프로젝트 템플릿 폴더의 하위 폴더가 됩니다.
이 섹션에서는 SimpleProject 프로젝트 형식에 대한 콘솔 자식 노드를 만드는 방법을 보여줍니다.
\Templates\Projects\SimpleProject\ 폴더의 이름을 \Templates\Projects\ConsoleApp\로 바꿉니다.
속성 창에서 \Templates\Projects\ConsoleApp\ 폴더의 5개 파일을 모두 선택하고 빌드 작업이ZipProject로 설정되어 있는지 확인합니다.
SimpleProject.vstemplate 파일의 닫는 태그 바로 앞에 TemplateData< 섹션의 >끝에 다음 줄을 추가합니다.
<NumberOfParentCategoriesToRollUp>1</NumberOfParentCategoriesToRollUp>이렇게 하면 콘솔 애플리케이션 템플릿이 콘솔 자식 노드와 자식 노드 위의 한 수준인 SimpleProject 부모 노드에 모두 표시됩니다.
SimpleProject.vstemplate 파일을 저장합니다.
.csproj 파일에서 각 ZipProject 요소에 OutputSubPath<를 추가>합니다. 이전과 같이 프로젝트를 언로드하고 프로젝트 파일을 편집합니다.
<ZipProject> 요소를 찾습니다. 각 <ZipProject> 요소에 <OutputSubPath> 요소를 추가하고 콘솔 값을 제공합니다. The ZipProject
<ZipProject Include="Templates\Projects\ConsoleApp\AssemblyInfo.cs"> <OutputSubPath>Console</OutputSubPath> </ZipProject> <ZipProject Include="Templates\Projects\ConsoleApp\Program.cs"> <OutputSubPath>Console</OutputSubPath> </ZipProject> <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.myproj"> <OutputSubPath>Console</OutputSubPath> </ZipProject> <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.vstemplate"> <OutputSubPath>Console</OutputSubPath> </ZipProject> <ZipProject Include="Templates\Projects\ConsoleApp\SimpleProject.ico"> <OutputSubPath>Console</OutputSubPath> </ZipProject>프로젝트 파일에 다음 <PropertyGroup> 을 추가합니다.
<PropertyGroup> <VsTemplateLanguage>SimpleProject</VsTemplateLanguage> </PropertyGroup>프로젝트 파일을 저장하고 프로젝트를 다시 로드합니다.
프로젝트 타입의 자식 노드 테스트
수정된 프로젝트 파일을 테스트하여 콘솔 자식 노드가 새 프로젝트 대화 상자에 표시되는지 확인합니다.
Microsoft Visual Studio 실험적 인스턴스 다시 설정 도구를 실행합니다.
SimpleProject 프로젝트를 다시 빌드하고 디버깅을 시작합니다. 실험적 인스턴스가 표시되어야 합니다.
새 프로젝트 대화 상자에서 SimpleProject 노드를 선택합니다. 콘솔 애플리케이션 템플릿이 템플릿 창에 표시되어야 합니다.
SimpleProject 노드를 확장합니다. Console의 자식 노드가 나타나야 합니다. SimpleProject 애플리케이션 템플릿이 템플릿 창에 계속 표시됩니다.
취소를 선택하고 디버깅을 중지합니다.
프로젝트 템플릿 매개 변수 대체
-
기본 프로젝트 시스템을 만드는 1부 에서는 기본 종류의 템플릿 매개 변수 대체를 수행하도록 메서드를 덮어쓰
ProjectNode.AddFileFromTemplate는 방법을 보여 줬습니다. 이 섹션에서는 보다 정교한 Visual Studio 템플릿 매개 변수를 사용하는 방법을 설명합니다.
새 프로젝트 대화 상자에서 Visual Studio 템플릿을 사용하여 프로젝트를 만들면 템플릿 매개 변수가 문자열로 대체되어 프로젝트를 사용자 지정합니다. 템플릿 매개 변수는 달러 기호(예: $time$)로 시작하고 끝나는 특수 토큰입니다. 다음 두 매개 변수는 템플릿을 기반으로 하는 프로젝트에서 사용자 지정을 사용하도록 설정하는 데 특히 유용합니다.
$GUID[1-10]$은 새 Guid로 대체됩니다. 최대 10개의 고유 GUID(예: $guid 1$)를 지정할 수 있습니다.
$safeprojectname$는 안전하지 않은 문자와 공백을 모두 제거하도록 수정된 새 프로젝트 대화 상자에서 사용자가 제공한 이름입니다.
템플릿 매개 변수의 전체 목록은 템플릿 매개 변수를 참조하세요.
프로젝트 템플릿 매개 변수를 대체하려면
SimpleProjectNode.cs 파일에서 메서드를 제거합니다
AddFileFromTemplate.\Templates\Projects\ConsoleApp\SimpleProject.myproj 파일에서 RootNamespace< 속성을 찾아 >해당 값을 $safeprojectname$로 변경합니다.
<RootNamespace>$safeprojectname$</RootNamespace>\Templates\Projects\SimpleProject\Program.cs 파일에서 파일의 내용을 다음 코드로 바꿉니다.
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; // Guid namespace $safeprojectname$ { [Guid("$guid1$")] public class $safeprojectname$ { static void Main(string[] args) { Console.WriteLine("Hello VSX!!!"); Console.ReadKey(); } } }SimpleProject 프로젝트를 다시 빌드하고 디버깅을 시작합니다. 실험적 인스턴스가 나타납니다.
새 SimpleProject 콘솔 애플리케이션을 만듭니다. (프로젝트 형식 창에서 SimpleProject를 선택합니다. Visual Studio 설치 템플릿에서 콘솔 애플리케이션을 선택합니다.)
새로 만든 프로젝트에서 Program.cs 엽니다. 다음과 같이 표시됩니다(파일의 GUID 값이 다릅니다.)
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; // Guid namespace Console_Application1 { [Guid("00000000-0000-0000-00000000-00000000)"] public class Console_Application1 { static void Main(string[] args) { Console.WriteLine("Hello VSX!!!"); Console.ReadKey(); } } }
프로젝트 속성 페이지 만들기
사용자가 템플릿을 기반으로 하는 프로젝트에서 속성을 보고 변경할 수 있도록 프로젝트 형식에 대한 속성 페이지를 만들 수 있습니다. 이 섹션에서는 구성 독립적 속성 페이지를 만드는 방법을 보여줍니다. 이 기본 속성 페이지는 속성 그리드를 사용하여 속성 페이지 클래스에 노출된 공용 속성을 표시합니다.
기본 클래스인 SettingsPage에서 속성 페이지 클래스를 파생합니다. 클래스에서 SettingsPage 제공하는 속성 그리드는 대부분의 기본 데이터 형식을 인식하고 이를 표시하는 방법을 알고 있습니다. 또한 클래스는 SettingsPage 프로젝트 파일에 속성 값을 유지하는 방법을 알고 있습니다.
이 섹션에서 만든 속성 페이지에서 다음 프로젝트 속성을 변경하고 저장할 수 있습니다.
어셈블리 이름
출력 유형
RootNamespace.
SimpleProjectPackage.cs 파일에서 이
ProvideObject특성을 클래스에SimpleProjectPackage추가합니다.[ProvideObject(typeof(GeneralPropertyPage))] public sealed class SimpleProjectPackage : ProjectPackage그러면 속성 페이지 클래스
GeneralPropertyPage가 COM에 등록됩니다.SimpleProjectNode.cs 파일에서
SimpleProjectNode클래스에 다음 두 재정의된 메서드를 추가합니다.protected override Guid[] GetConfigurationIndependentPropertyPages() { Guid[] result = new Guid[1]; result[0] = typeof(GeneralPropertyPage).GUID; return result; } protected override Guid[] GetPriorityProjectDesignerPages() { Guid[] result = new Guid[1]; result[0] = typeof(GeneralPropertyPage).GUID; return result; }이러한 두 메서드는 모두 속성 페이지 GUID의 배열을 반환합니다. GeneralPropertyPage GUID는 배열의 유일한 요소이므로 속성 페이지 대화 상자에 하나의 페이지만 표시됩니다.
SimpleProject 프로젝트에 GeneralPropertyPage.cs 클래스 파일을 추가합니다.
다음 코드를 사용하여 이 파일의 내용을 바꿉니다.
using System; using System.Runtime.InteropServices; using Microsoft.VisualStudio; using Microsoft.VisualStudio.Project; using System.ComponentModel; namespace SimpleProject { [ComVisible(true)] [Guid("6BC7046B-B110-40d8-9F23-34263D8D2936")] public class GeneralPropertyPage : SettingsPage { private string assemblyName; private OutputType outputType; private string defaultNamespace; public GeneralPropertyPage() { this.Name = "General"; } [Category("AssemblyName")] [DisplayName("AssemblyName")] [Description("The output file holding assembly metadata.")] public string AssemblyName { get { return this.assemblyName; } } [Category("Application")] [DisplayName("OutputType")] [Description("The type of application to build.")] public OutputType OutputType { get { return this.outputType; } set { this.outputType = value; this.IsDirty = true; } } [Category("Application")] [DisplayName("DefaultNamespace")] [Description("Specifies the default namespace for added items.")] public string DefaultNamespace { get { return this.defaultNamespace; } set { this.defaultNamespace = value; this.IsDirty = true; } } protected override void BindProperties() { this.assemblyName = this.ProjectMgr.GetProjectProperty("AssemblyName", true); this.defaultNamespace = this.ProjectMgr.GetProjectProperty("RootNamespace", false); string outputType = this.ProjectMgr.GetProjectProperty("OutputType", false); this.outputType = (OutputType)Enum.Parse(typeof(OutputType), outputType); } protected override int ApplyChanges() { this.ProjectMgr.SetProjectProperty("AssemblyName", this.assemblyName); this.ProjectMgr.SetProjectProperty("OutputType", this.outputType.ToString()); this.ProjectMgr.SetProjectProperty("RootNamespace", this.defaultNamespace); this.IsDirty = false; return VSConstants.S_OK; } } }이 클래스는
GeneralPropertyPageAssemblyName, OutputType 및 RootNamespace의 세 가지 공용 속성을 노출합니다. AssemblyName에는 set 메서드가 없으므로 읽기 전용 속성으로 표시됩니다. OutputType은 열거형 상수이므로 드롭다운 목록으로 표시됩니다.기본 클래스는
SettingsPage속성을 유지하기 위해 제공합니다ProjectMgr. 이BindProperties메서드는 지속형 속성 값을 검색하여 해당 속성을ProjectMgr로 설정합니다. 이 메서드는ApplyChanges속성 값을 가져와서 프로젝트 파일에 유지하는 데 사용합니다ProjectMgr. 속성 집합 메서드는 속성을 유지해야 함을 나타내기 위해 true로 설정합니다IsDirty. 지속성은 프로젝트 또는 솔루션을 저장할 때 발생합니다.SimpleProject 솔루션을 다시 빌드하고 디버깅을 시작합니다. 실험적 인스턴스가 나타납니다.
실험적 인스턴스에서 새 SimpleProject 애플리케이션을 만듭니다.
Visual Studio는 Visual Studio 템플릿을 사용하여 프로젝트 팩터리를 호출하여 프로젝트를 만듭니다. 새 Program.cs 파일이 코드 편집기에서 열립니다.
솔루션 탐색기에서 프로젝트 노드를 마우스 오른쪽 단추로 클릭한 다음 속성을 선택합니다. 속성 페이지 대화 상자가 표시됩니다.
프로젝트 속성 페이지 테스트
이제 속성 값을 수정하고 변경할 수 있는지 여부를 테스트할 수 있습니다.
MyConsoleApplication 속성 페이지 대화 상자에서 DefaultNamespace를 MyApplication으로 변경합니다.
OutputType 속성을 선택한 다음 클래스 라이브러리를 선택합니다.
적용을 선택한 다음 확인을 선택합니다.
속성 페이지 대화 상자를 다시 열고 변경 내용이 유지되었는지 확인합니다.
Visual Studio의 실험적 인스턴스를 닫습니다.
실험적 인스턴스를 다시 엽니다.
속성 페이지 대화 상자를 다시 열고 변경 내용이 유지되었는지 확인합니다.
Visual Studio의 실험적 인스턴스를 닫습니다.