我在 Visual Studio 2012 中创建了一个新的 VSIX 扩展项目,并编写了一个 MEF 分类器(作为测试),它应该简单地突出显示.mylang
文件中的所有文本。以下是我的 .NET 4.5 代码的相关部分:
internal static class MyLangLanguage
{
public const string ContentType = "mylang";
public const string FileExtension = ".mylang";
[Export(typeof(ClassificationTypeDefinition))]
[Name(ContentType)]
[BaseDefinition("code")]
internal static ContentTypeDefinition MyLangSyntaxContentTypeDefinition = null;
[Export]
[FileExtension(FileExtension)]
[ContentType(ContentType)]
internal static FileExtensionToContentTypeDefinition MyLangSyntaxFileExtensionDefinition = null;
}
[Export(typeof(IClassifierProvider))]
[ContentType(MyLangLanguage.ContentType)]
[Name("MyLangSyntaxProvider")]
internal sealed class MyLangSyntaxProvider : IClassifierProvider
{
[Import]
internal IClassificationTypeRegistryService ClassificationRegistry = null;
public IClassifier GetClassifier(ITextBuffer buffer)
{
return buffer.Properties.GetOrCreateSingletonProperty(() => new MyLangSyntax(ClassificationRegistry, buffer));
}
}
internal sealed class MyLangSyntax : IClassifier { }
这些是我source.extension.vsixmanifest
文件中的相关部分。根据我在网上找到的建议和类似文件,我添加了对 MPF 和这两个资产的依赖。
<?xml version="1.0" encoding="utf-8"?>
<PackageManifest Version="2.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2011" xmlns:d="http://schemas.microsoft.com/developer/vsx-schema-design/2011">
<!-- ... -->
<Dependencies>
<Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="4.5" />
<Dependency d:Source="Installed" Id="Microsoft.VisualStudio.MPF.11.0" DisplayName="Visual Studio MPF 11.0" Version="[11.0,12.0)" />
</Dependencies>
<Assets>
<Asset Type="Microsoft.VisualStudio.VsPackage" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%;PkgdefProjectOutputGroup|" />
<Asset Type="Microsoft.VisualStudio.MefComponent" d:Source="Project" d:ProjectName="%CurrentProject%" Path="|%CurrentProject%|" />
</Assets>
</PackageManifest>
我还尝试了 1.0 版清单:
<?xml version="1.0" encoding="utf-8"?>
<Vsix Version="1.0.0" xmlns="http://schemas.microsoft.com/developer/vsx-schema/2010">
<!-- ... -->
<References />
<Content>
<MefComponent>|%CurrentProject%|</MefComponent>
</Content>
</Vsix>
当我运行它时,它会启动 Visual Studio 2012 的实验实例,并且扩展和更新窗口显示我的扩展处于活动状态。但是,当我加载或创建 .mylang 文件时,它不会做任何事情。我从扩展中抛出(作为测试)的任何异常都不会被抛出。断点永远不会被击中,并获得带有以下警告的感叹号:
当前不会命中断点。没有为此文档加载任何符号。
感觉好像我的扩展程序根本没有真正加载。我的问题类似于这个问题和这个问题,但我使用的是 Visual Studio 2012,它使用新的 VSIX 清单格式。
我知道的:
- 我可以在文件夹中找到我的 DLL 和 VSIX 文件
%localappdata%\Microsoft\VisualStudio\11.0Exp\Extensions\MyLang\VSIXProject1\1.0
,所以我知道它们被复制了。 - 它们的时间戳对应于我上次构建项目的时间,所以我知道它们是最新的。
- 项目属性 > 调试 > 启动外部程序:已自动设置为
C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\devenv.exe
,并且命令行参数自动设置为/rootsuffix Exp
。 - Visual Studio 日志(使用该
/log
选项创建)有两个与我的扩展相关的条目:Successfully loaded extension...
和Extension is enabled...
. - 我的 DLL没有出现在调试 Visual Studio 的“模块”选项卡(所有加载的 DLL 列表)上,而一些(不是全部)其他扩展确实出现了。
- 它不会在我的笔记本电脑和台式电脑上加载到 Visual Studio 2012 或 2010 中。
我试过的:
- 根据这个建议在.csproj文件中设置
<IncludeAssemblyInVSIXContainer>
为,但没有任何区别。true
- 我无法将该行添加
<MefComponent>|%CurrentProject%|</MefComponent>
到source.extension.vsixmanifest文件,因为它使用的格式 (2.0) 与以前版本的 Visual Studio (1.0) 的 VSIX 项目不同。 - 这个建议(在我的.csproj中设置
IncludeAssemblyInVSIXContainer
和朋友)但它没有任何区别。而且我的断点仍然显示警告并且没有被击中。true
- 根据此建议,使用开始菜单中的重置 Visual Studio 2012 实验实例快捷方式重置 VS 实验实例。这并没有什么不同。
我怎样才能至少确保我的 VSIX MEF 扩展已加载并正常工作?如果可能的话,我怎样才能通过断点工作并调试它?