1

Visual Studio 2012/2013 用のカスタム言語サービスを作成しようとしています (これら 2 つの間に大きな違いはないようです)。カスタム言語サービスは、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 オブジェクトを呼び出すときにメソッド カスケードを使用することです。

これは、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;

于 2014-09-01T13:57:53.920 に答える