2012-05-28 2 views
0

visual studio package을 작성했습니다. 내 요구 사항은 사용자가 작성해야합니다. empty visual studio project C++ or C#입니다. 어떻게 동적으로 생성 된 파일을 추가 할 수 있도록 private void MenuItemCallback(object sender, EventArgs e)에서이 프로젝트에 액세스 할 수 있습니까?MenuItemCallback, Visual Studio 패키지 및 새 파일 만들기

이 난 후, 공유 DLL 프로젝트와 실행 가능한 프로젝트를 만들려면 필요한 초기화 코드에 필요한 모든 참조와 파일을 추가 할 지금

private void MenuItemCallback(object sender, EventArgs e) 
{ 
     IVsSolution solutionService = GetService(typeof(SVsSolution)) as IVsSolution; 
     // get all projects in solution 
     IEnumHierarchies enumHierarchies = null; 
     Guid guid = Guid.Empty; 
       ErrorHandler.ThrowOnFailure(solutionService.GetProjectEnum( (uint)__VSENUMPROJFLAGS.EPF_ALLINSOLUTION,ref guid,out enumHierarchies)); 
       //Loop all projects found 
       if (enumHierarchies != null) 
       { 
        // Loop projects found 
        IVsHierarchy[] hierarchy = new IVsHierarchy[1]; 
        uint fetched = 0; 

        while (enumHierarchies.Next(1, hierarchy, out fetched) == VSConstants.S_OK && fetched == 1)    {     
         Guid projectGuid; 
         ErrorHandler.ThrowOnFailure(hierarchy[0].GetGuidProperty(VSConstants.VSITEMID_ROOT, (int)__VSHPROPID.VSHPROPID_ProjectIDGuid, out projectGuid)); 
        } 
       }    
      } 
+0

클래스 라이브러리, 콘솔 응용 프로그램, Windows Form 응용 프로그램 등을 선택할 때처럼 사용자가 선택할 수있는 프로젝트의 일종 인 프로젝트 템플릿을 만들겠습니까? ? 또는 사용자가 새 빈 프로젝트를 만들 때마다 파일을 추가하는 AddIn을 개발해야하는 이유가 있습니까? –

+0

마법사를 생성하고 일부 헤더 및 코드 파일을 생성하려는 응답을 기반으로 몇 가지 질문을하는 새 메뉴 항목을 만들었습니다. – Avinash

+0

확인. 이 마법사를 사용하여 프로젝트 템플릿의 출력을 유도 할 수 있습니다. 이것은 당신이하고 싶은 것입니까, 아니면 생성 된 모든 빈 프로젝트에 대해 행동하고 싶습니까? –

답변

0

까지 한 일이다. 사용자의 방향을 관리해야하므로 프로젝트를 아직 템플릿으로 내보낼 수 없습니다.

사용자 입력이나 프로젝트 이름에 의존하는 특정 문자열이 있으면 $ 사이에 이름을 넣어 매개 변수로 식별해야합니다 (템플릿에 대한 표준 매개 변수조차도 있음).

: 특히, 당신이 Microsoft.VisualStudio.TemplateWizard.IWizard를 구현하는 클래스와 다른 프로젝트를 생성해야 사용자가이 방법을 당신의 마법사를 사용하려면

public class $aclassname$ : YourBaseClass 

: 예를 들어 당신이 뭔가를 할 수

public void RunStarted(object automationObject, Dictionary<string, string> replacementsDictionary, WizardRunKind runKind, object[] customParams) 

사용자가 직접 마법사를 열고 사용자의 입력에 따라 작동시킬 수 있습니다. 특히 당신은 예를 들어, 당신이 당신의 템플릿에 넣어 매개 변수를 대체 할 replacementsDictionary에 항목을 추가 할 수 있습니다

replacementsDictionary.Add("$aclassname$", aVarFromYourWizard); 

는 또한, automationobject은으로 VisualStudio 인스턴스를 가리키는 EnvDTE.DTEClass의 인스턴스입니다. 즉, DTEClass로 변환 한 다음이를 사용하여 생성하려는 프로젝트를 가져와 필요에 따라 수정할 수 있습니다.

이 마법사 프로젝트를 마쳤 으면 먼저이 마법사 어셈블리에 서명 한 템플릿을 사용하려면 템플릿 프로젝트로 돌아가서 파일 프로젝트를 내보낼 수 있습니다 (파일 -> 템플릿을 VSIX로 내보내기). 주의해서 마법사 어셈블리를 지정하십시오.

herehere도 볼 수 있습니다.

편집 :

내가 IWizard 당신이 당신의 템플릿 파일이 실제 프로젝트 여부에 추가해야하는지 여부를 지정할 수있는 mathod을 가지고 추가하는 것을 잊었다. 분명히 마법사의 데이터를 사용하여 수행 할 작업을 결정할 수 있습니다. 그것은 :

public bool ShouldAddProjectItem(string filePath) 

이 방법은 AddIn을 개발하는 것보다 훨씬 쉽고 유지 관리가 쉽다고 생각합니다.

관련 문제