我正在尝试为 Visual Studio 2012/2013 创建自定义语言服务(这两者之间似乎没有太大区别)。自定义语言服务适用于尚未集成到 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 集成的源代码,但这太复杂了。