1

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

我正在使用ProjectPackageMPF 来实现我的包:

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

4

1 回答 1

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 = 自动化对象.ConfigurationManager; EnvDTE.Configuration activeConfig = configManager.ActiveConfiguration;

于 2014-09-01T13:57:53.920 回答