새 프로젝트 생성: 내부 살펴보기, 1부
고유한 프로젝트 형식을 만드는 방법에 대해 생각해 본 적이 있나요? 새 프로젝트를 만들 때 실제로 어떤 작업이 수행되는지 궁금하신가요? 내부를 들여다 보고 실제로 어떤 작업이 수행되는지 살펴보겠습니다.
Visual Studio에서 조정하는 몇 가지 작업은 다음과 같습니다.
사용 가능한 모든 프로젝트 형식의 트리가 표시됩니다.
각 프로젝트 형식에 대한 애플리케이션 템플릿 목록을 표시하고 하나를 선택할 수 있습니다.
프로젝트 이름 및 경로와 같은 애플리케이션에 대한 프로젝트 정보를 수집합니다.
이 정보는 프로젝트 팩터리에 전달됩니다.
현재 솔루션에서 프로젝트 항목 및 폴더를 생성합니다.
새 프로젝트 대화 상자
이 모든 작업은 새 프로젝트에 대한 프로젝트 형식을 선택할 때 시작됩니다. 파일 메뉴에서 새 프로젝트를 클릭하여 시작하겠습니다. 다음과 같이 새 프로젝트 대화 상자가 표시됩니다.
좀 더 자세히 살펴보겠습니다. 프로젝트 형식 트리에는 만들 수 있는 다양한 프로젝트 형식이 나열됩니다. Visual C# Windows와 같은 프로젝트 형식을 선택하면 시작할 애플리케이션 템플릿 목록이 표시됩니다. Visual Studio 설치된 템플릿은 Visual Studio에서 설치되며 컴퓨터의 어떤 사용자든 사용할 수 있습니다. 만들거나 수집하는 새 템플릿은 내 템플릿에 추가할 수 있으며 사용자만 사용할 수 있습니다.
Windows 애플리케이션과 같은 템플릿을 선택하면 애플리케이션 형식에 대한 설명이 대화 상자에 나타납니다. 이 경우 Windows 사용자 인터페이스를 사용하여 애플리케이션을 만들기 위한 프로젝트입니다.
새 프로젝트 대화 상자 아래쪽에 추가 정보를 수집하는 여러 컨트롤이 표시됩니다. 표시되는 컨트롤은 프로젝트 형식에 따라 달라지지만 일반적으로 프로젝트 이름 텍스트 상자, 위치 텍스트 상자 및 관련 찾아보기 단추, 솔루션 이름 텍스트 상자 및 관련 솔루션 디렉터리 만들기 확인란이 포함됩니다.
새 프로젝트 대화 상자 채우기
새 프로젝트 대화 상자의 정보는 어디에서 가져올 수 있나요? 여기에는 두 가지 메커니즘이 있으며, 그 중 하나는 더 이상 사용되지 않습니다. 새 프로젝트 대화 상자는 두 메커니즘에서 가져온 정보를 결합하고 표시합니다.
이전(사용되지 않는) 메서드는 시스템 레지스트리 항목 및 .vsdir 파일을 사용합니다. 이 메커니즘은 Visual Studio를 열 때 실행됩니다. 최신 메서드는 .vstemplate 파일을 사용합니다. 이 메커니즘은 예를 들어 다음을 실행하여 Visual Studio가 초기화될 때 실행됩니다.
devenv /setup
또는
devenv /installvstemplates
프로젝트 형식:
Visual C# 및 기타 언어와 같은 프로젝트 형식 루트 노드의 위치와 이름은 시스템 레지스트리 항목에 따라 결정됩니다. 데이터베이스 및 스마트 디바이스와 같은 자식 노드의 조직은 해당 .vstemplate 파일이 포함된 폴더의 계층 구조를 반영합니다. 먼저 루트 노드를 살펴보겠습니다.
프로젝트 형식 루트 노드
Visual Studio가 초기화되면 시스템 레지스트리 키 HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\14.0\NewProjectTemplates\TemplateDirs의 하위 키를 탐색하여 프로젝트 형식 트리의 루트 노드를 빌드하고 이름을 지정합니다. 이 정보는 나중에 사용하기 위해 캐시됩니다. TemplateDirs\{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}\/1 키를 확인합니다. 각 항목은 VSPackage GUID입니다. 하위 키의 이름(/1)은 무시되지만 현재 상태는 프로젝트 형식 루트 노드임을 나타냅니다. 루트 노드에는 프로젝트 형식 트리에서 모양을 제어하는 여러 하위 키가 있을 수 있습니다. 이 중 일부 값을 살펴보겠습니다.
(기본값)
루트 노드의 이름을 지정하는 지역화된 문자열의 리소스 ID입니다. 문자열 리소스는 VSPackage GUID에서 선택한 위성 DLL에 있습니다.
이 예제에서 VSPackage GUID는
{FAE04EC1-301F-11D3-BF4B-00C04F79EFBC}
이고 루트 노드(/1)의 리소스 ID(기본값)는 #2345입니다.
근처 Packages 키에서 GUID를 조회하고 Satellite Dll 하위 키를 검사하면 문자열 리소스가 포함된 어셈블리의 경로를 찾을 수 있습니다.
<Visual Studio 설치 경로>\VC#\VCSPackages\1033\csprojui.dll
이를 확인하려면 파일 탐색기를 열고 csprojui.dll을 Visual Studio 디렉터리로 끌어옵니다. 문자열 테이블은 #2345 리소스에 Visual C#이라는 캡션이 있음을 보여 줍니다.
SortPriority
프로젝트 형식 트리에서 루트 노드의 위치를 결정합니다.
SortPriority REG_DWORD 0x00000014 (20)
우선 순위 수가 낮을수록 트리의 위치가 높습니다.
DeveloperActivity
이 하위 키가 있는 경우 루트 노드의 위치는 개발자 설정 대화 상자를 통해 제어됩니다. 예를 들면 다음과 같습니다.
DeveloperActivity REG_SZ VC#
Visual Studio가 Visual C++ 개발용으로 설정된 경우 Visual C#이 루트 노드임을 나타냅니다. 그렇지 않으면 다른 언어의 자식 노드가 됩니다.
폴더
이 하위 키가 있으면 루트 노드는 지정된 폴더의 자식 노드가 됩니다. 키 아래에 가능한 폴더 목록이 표시됩니다.
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\11.0\NewProjectTemplates\PseudoFolders
예를 들어 데이터베이스 프로젝트 항목에는 PseudoFolders의 기타 프로젝트 형식 항목과 일치하는 폴더 키가 있습니다. 따라서 프로젝트 형식 트리에서 데이터베이스 프로젝트는 기타 프로젝트 형식의 자식 노드가 됩니다.
프로젝트 형식 자식 노드 및 .vstdir 파일
프로젝트 형식 트리에서 자식 노드의 위치는 ProjectTemplates 폴더에 있는 폴더의 계층 구조를 따릅니다. 컴퓨터 템플릿(Visual Studio 설치 템플릿)의 경우 일반적인 위치는 \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\이고 사용자 템플릿(내 템플릿)의 경우 일반적인 위치는 \My Documents\Visual Studio 14.0\Templates\ProjectTemplates\입니다. 이러한 두 위치의 폴더 계층 구조가 병합되어 프로젝트 형식 트리를 만듭니다.
C# 개발자 설정이 있는 Visual Studio의 경우 프로젝트 형식 트리는 다음과 같습니다.
해당 ProjectTemplates 폴더는 다음과 같습니다.
새 프로젝트 대화 상자가 열리면 Visual Studio에서는 ProjectTemplates 폴더를 트래버스하고 다음과 같이 몇 가지를 변경하여 프로젝트 형식 트리에서 구조를 다시 만듭니다.
프로젝트 형식 트리의 루트 노드는 애플리케이션 템플릿에 따라 결정됩니다.
노드 이름은 지역화할 수 있으며 특수 문자를 포함할 수 있습니다.
정렬 순서를 변경할 수 있습니다.
프로젝트 형식의 루트 노드 찾기
Visual Studio에서 ProjectTemplates 폴더를 트래버스하면 모든 .zip 파일이 열리고 .vstemplate 파일이 추출됩니다. .vstemplate 파일은 XML을 사용하여 애플리케이션 템플릿을 설명합니다. 자세한 내용은 새 프로젝트 생성: 내부 살펴보기, 2부를 참조하세요.
<ProjectType> 태그는 애플리케이션의 프로젝트 형식을 결정합니다. 예를 들어 \CSharp\SmartDevice\WindowsCE\1033\WindowsCE-EmptyProject.zip 파일에는 다음 태그가 있는 EmptyProject.vstemplate 파일이 포함됩니다.
<ProjectType>CSharp</ProjectType>
ProjectTemplates 폴더의 하위 폴더가 아닌 <ProjectType> 태그는 프로젝트 형식 트리에서 애플리케이션의 루트 노드를 결정합니다. 이 예제에서는 Windows CE 애플리케이션이 Visual C# 루트 노드 아래에 표시되고 WindowsCE 폴더를 VisualBasic 폴더로 이동하더라도 Windows CE 애플리케이션은 Visual C# 루트 노드 아래에 계속 표시됩니다.
노드 이름 지역화
Visual Studio는 ProjectTemplates 폴더를 트래버스할 때 찾은 모든 .vstdir 파일을 검사합니다. .vstdir 파일은 새 프로젝트 대화 상자에서 프로젝트 형식의 모양을 제어하는 XML 파일입니다. .vstdir .vstdir 파일에서 <LocalizedName> 태그를 사용하여 프로젝트 형식 노드의 이름을 지정합니다.
예를 들어 \CSharp\Database\TemplateIndex.vstdir 파일에는 다음 태그가 포함됩니다.
<LocalizedName Package="{462b036f-7349-4835-9e21-bec60e989b9c}" ID="4598"/>
루트 노드(이 경우 데이터베이스)의 이름을 지정하는 지역화된 문자열의 위성 DLL 및 리소스 ID를 결정합니다. 지역화된 이름에는 .NET과 같은 폴더 이름에 사용할 수 없는 특수 문자가 포함될 수 있습니다.
<LocalizedName> 태그가 없으면 프로젝트 형식의 이름은 폴더 자체인 SmartPhone2003으로 지정됩니다.
프로젝트 형식의 정렬 순서 찾기
프로젝트 형식의 정렬 순서를 확인하기 위해 .vstdir 파일은 <SortOrder> 태그를 사용합니다.
예를 들어 \CSharp\Windows\Windows.vstdir 파일에는 다음 태그가 포함됩니다.
<SortOrder>5</SortOrder>
\CSharp\Database\TemplateIndex.vstdir 파일에는 더 큰 값의 태그가 있습니다.
<SortOrder>5000</SortOrder>
<SortOrder> 태그의 숫자가 낮을수록 트리의 위치가 높아지므로 Windows 노드가 프로젝트 형식 트리의 데이터베이스 노드보다 높게 표시됩니다.
프로젝트 형식에 <SortOrder> 태그를 지정하지 않으면 <SortOrder> 사양이 포함된 프로젝트 형식에 따라 사전순으로 표시됩니다.
내 문서(내 템플릿) 폴더에는 .vstdir 파일이 없습니다. 사용자 애플리케이션 프로젝트 형식 이름은 지역화되지 않으며 사전순으로 표시됩니다.
빠른 검토
새 프로젝트 대화 상자를 수정하고 새 사용자 프로젝트 템플릿을 만들어 보겠습니다.
MyProjectNode 하위 폴더를 \Program Files\Microsoft Visual Studio 14.0\Common7\IDE\ProjectTemplates\CSharp 폴더에 추가합니다.
텍스트 편집기를 사용하여 MyProjectNode 폴더에서 MyProject.vstdir 파일을 만듭니다.
.vstdir 파일에 다음 줄을 추가합니다.
<TemplateDir Version="1.0.0"> <SortOrder>6</SortOrder> </TemplateDir>
.vstdir 파일을 저장한 후 닫습니다.
텍스트 편집기를 사용하여 MyProjectNode 폴더에서 MyProject.vstemplate 파일을 만듭니다.
.vstemplate 파일에 다음 줄을 추가합니다.
<VSTemplate Version="2.0.0" Type="Project" xmlns="http://schemas.microsoft.com/developer/vstemplate/2005"> <TemplateData> <ProjectType>CSharp</ProjectType> </TemplateData> </VSTemplate>
.vstemplate 파일을 저장한 후 편집기를 닫습니다.
.vstemplate 파일을 압축된 새 MyProjectNode\MyProject.zip 폴더로 보냅니다.
Visual Studio 명령 창에 다음을 입력합니다.
devenv /installvstemplates
Visual Studio를 엽니다.
새 프로젝트 대화 상자를 열고 Visual C# 프로젝트 노드를 확장합니다.
MyProjectNode는 노드 바로 아래에 Visual C#의 자식 노드로 표시됩니다.