创建新的自定义项目类型或关闭时,Visual Studio 2012/2013崩溃

时间:2013-07-31 12:19:32

标签: visual-studio plugins visual-studio-2012 vspackage

我正在尝试为Visual Studio 2012/2013创建自定义语言服务(这两者之间似乎没有太大区别)。自定义语言服务适用于尚未集成到Visual Studio中的编译器。我开始为我的自定义项目类型创建一个Visual Studio包。一切正常,但是当我在Visual Studio中创建一个新项目时,它会崩溃。有时它只会在我关闭Visual Studio时崩溃。我总是得到一个COMException,没有其他提示问题。我认为我的Visual Studio包没有任何问题,而是我的自定义项目文件。当我使用MSBUILD时,它构建得很好,但Visual Studio因为某些原因不喜欢它。我听说还有其他人遇到同样的问题而且总是与自定义项目文件有关。不幸的是,关于该主题的文档很少。

我使用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集成的源代码,但这太复杂了。

1 个答案:

答案 0 :(得分:1)

问题是在MPFProj源中调用COM对象时使用方法级联。

我能够通过修改GetActiveConfigurationName方法来解决这个问题,该方法位于Dev12 \ Src \ CSharp \ Utilities.cs的第431行附近。 [请注意,我使用的是从这里下载的2013版MPFProj:https://mpfproj12.codeplex.com]

更改以下行:

EnvDTE.Configuration activeConfig = automationObject.ConfigurationManager.ActiveConfiguration;

到此:

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