2013-07-31 2 views
1

Visual Studio 2012/2013에 대한 사용자 지정 언어 서비스를 만들려고합니다 (이 두 가지 차이점은별로 없을 것 같습니다) . 사용자 지정 언어 서비스는 아직 Visual Studio에 통합되지 않은 컴파일러 용입니다. 내 사용자 지정 프로젝트 형식에 대한 Visual Studio 패키지를 만들어 시작했습니다. 모두 잘 작동하지만 Visual Studio에서 새 프로젝트를 만들면 충돌이 발생합니다. 때로는 Visual Studio를 닫을 때만 중단됩니다. 나는 항상 문제에 대한 다른 힌트가없는 COMException을 얻는다. 내 Visual Studio 패키지에는 문제가 없지만 내 사용자 지정 프로젝트 파일에는 문제가 없다고 생각합니다. 그것은 MSBUILD를 사용할 때 좋지만 Visual Studio는 어떤 이유로 든 그것을 좋아하지 않습니다. 나는 같은 문제를 가진 다른 사람들이 있고 그것이 항상 커스텀 프로젝트 파일과 관련이 있다고 들었다. 불행히도 그 주제에 대한 문서는 거의 없습니다.새 사용자 지정 프로젝트 유형을 만들거나 닫을 때 Visual Studio 2012/2013이 충돌 함

내 패키지 구현하는 MPF의 ProjectPackage을 사용하고 있습니다 :

[ProvideProjectFactory(typeof(MyProjectFactory), null, "My Project Files (*.myproj);*.myproj", "myproj", "myproj", @"Templates\Projects", LanguageVsTemplate = "My Project")] 
[PackageRegistration(UseManagedResourcesOnly = true)] 
[InstalledProductRegistration("#110", "#112", "1.0", IconResourceID = 400)] 
[Guid(GuidList.ProjectPackageGuidString)] 
public sealed class MyProjectPackage : ProjectPackage 
{ 
    public MyProjectPackage() 
    { 
     Debug.WriteLine(string.Format(CultureInfo.CurrentCulture, "Entering constructor for: {0}", this.ToString())); 
    } 

    protected override void Initialize() 
    { 
     base.Initialize(); 
     this.RegisterProjectFactory(new MyProjectFactory(this)); 
    } 

    public override string ProductUserContext 
    { 
     get { return string.Empty; } 
    } 
} 

이 내 프로젝트의 공장 모습입니다 같은 :

[Guid(GuidList.ProjectFactoryGuidString)] 
public class MyProjectFactory : ProjectFactory 
{ 
    public MyProjectFactory(Package package) 
     : base(package) 
    { 
     this.package = package; 
    } 

    private Package package; 

    protected override ProjectNode CreateProject() 
    { 
     MyProjectNode project = new MyProjectNode(this.package); 
     project.SetSite((IOleServiceProvider)((IServiceProvider)this.package).GetService(typeof(IOleServiceProvider))); 
     return project; 
    } 
} 

그리고 이것은 내 사용자 지정 프로젝트 노드 :

public class MyProjectNode : ProjectNode 
{ 
    public MyProjectNode(Package package) 
    { 
     this.package = package; 
    } 

    private Package package; 

    public override Guid ProjectGuid 
    { 
     get { return new Guid(GuidList.ProjectFactoryGuidString); } 
    } 

    public override string ProjectType 
    { 
     get { return "My Project"; } 
    } 

    public override void AddFileFromTemplate(string source, string target) 
    { 
     this.FileTemplateProcessor.AddReplace("$Title$", Path.GetFileNameWithoutExtension(target)); 

     this.FileTemplateProcessor.UntokenFile(source, target); 
     this.FileTemplateProcessor.Reset(); 
    } 
} 

그리고 내 맞춤 프로젝트 파일입니다. 나는 문제를 찾기 위해 최소한에 아래로 제거하지만 도움이되지 않았다 :

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> 
    <PropertyGroup> 
    <SchemaVersion>2.0</SchemaVersion> 
    <ProjectGuid>454501B3-90E2-4735-ABDF-27B77BEBFD7A</ProjectGuid> 
    </PropertyGroup> 
    <ItemGroup> 
    <Compile Include="Program.my" /> 
    </ItemGroup> 
    <Target Name="Build"> 
    <Message Text="Hello, World!" /> 
    </Target> 
</Project> 

는 사람이 경험이 있습니까? IronPython과 IronRuby Visual Studio 통합 소스 코드를 살펴 봤지만 너무 복잡합니다.

+0

Visual Studio를 디버그하여 충돌 원점을 확인할 수 있습니다. –

+0

네,하지만 문제는 더 이상의 정보가없는 COMException 만 발생한다는 것입니다. Visual Studio 플러그인을 만드는 데 익숙하지 않아 3 일간의 연구가 끝난 후에도 해결책을 찾지 못했습니다. – David

+0

VS 개발은 실제로 어렵습니다 :-) 첫 번째 기회를 포함하여 모든 예외를 잡아야하므로 스택 프레임을 얻을 수 있습니다. 여기를 참조하십시오 : http://stackoverflow.com/questions/8218249/how-do-i-enable-visual-studio-2010-to-break-when-a-first-chance-exception-happen –

답변

1

문제는 MPFProj 원본에서 COM 개체를 호출 할 때 계단식 연결을 사용하는 것입니다.

Dev12 \ Src \ CSharp \ Utilities.cs의 431 행 주위에있는 GetActiveConfigurationName 메서드를 수정하여이 문제를 해결할 수있었습니다. [여기에서 다운로드 MPFProj의 2013 버전을 사용하고 있습니다 : https://mpfproj12.codeplex.com]

변경 다음 줄

EnvDTE.Configuration activeConfig = automationObject.ConfigurationManager.ActiveConfiguration; 이에

:

EnvDTE.ConfigurationManager CONFIGMANAGER = automationObject.ConfigurationManager; EnvDTE.Configuration activeConfig = configManager.ActiveConfiguration;