我正在尝试为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集成的源代码,但这太复杂了。
答案 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;