Visual Studio 2012/2013 用のカスタム言語サービスを作成しようとしています (これら 2 つの間に大きな違いはないようです)。カスタム言語サービスは、Visual Studio にまだ統合されていないコンパイラ用です。カスタム プロジェクト タイプ用の Visual Studio パッケージを作成することから始めました。すべて正常に動作しますが、Visual Studio で新しいプロジェクトを作成するとクラッシュします。Visual Studio を閉じたときにのみクラッシュすることがあります。私は常に COMException を取得しますが、他に問題のヒントはありません。Visual Studio パッケージに問題はなく、カスタム プロジェクト ファイルに問題があると思います。MSBUILD を使用すると正常にビルドされますが、何らかの理由で Visual Studio が気に入りません。同じ問題を抱えている人が他にもいると聞きましたが、それは常にカスタム プロジェクト ファイルに関係していました。
ProjectPackage
MPF を使用してパッケージを実装しています。
[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 統合のソース コードを見ましたが、これは複雑すぎます。