【问题标题】:MEF Import Exception w/ Visual Studio 2015 Extension带有 Visual Studio 2015 扩展的 MEF 导入异常
【发布时间】:2015-09-12 12:35:18
【问题描述】:

希望有人可以就我在 VS2015 扩展中使用 MEF 时遇到的问题为我提供一些指导。我正在尝试扩展 VS 的 IntelliSense 功能,并以本教程为基础:https://msdn.microsoft.com/en-us/library/ee372314.aspx

这是我的 ICompletionSourceProvider:

[Export(typeof(ICompletionSourceProvider))]
[Name("Test Statement Completion Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class MyCompletionSourceProvider : ICompletionSourceProvider
{
    [Import]
    internal ITextStructureNavigatorSelectorService NavigatorService { get; set; }

    [Import]
    internal IServiceProvider ServiceProvider { get; set; }

    public ICompletionSource TryCreateCompletionSource(ITextBuffer textBuffer)
    {
        return new MyCompletionSource(this, textBuffer);
    }
}

这里奇怪的是,这在我的机器上运行良好(最初开发此代码的地方),但无法在我尝试过的所有其他机器上运行(在调试和发布中)。放置在 TryCreateCompletionSource 中的断点永远不会被命中。我怀疑这个 MEF 组件从未被导出,所以我按照 MSDN 上的推荐下载了 mefx 工具并在我生成的 DLL 上执行它并收到以下信息:

[Primary Rejection]
[Export] MyVSIX.Source.MyCompletionSourceProvider             (ContractName="Microsoft.VisualStudio.Language.Intellisense.ICompletionSourceProvider")
[Import] MyVSIX.Source.MyCompletionSourceProvider.NavigatorService (ContractName="Microsoft.VisualStudio.Text.Operations.ITextStructureNavigatorSelectorService")
[Exception]   System.ComponentModel.Composition.ImportCardinalityMismatchException: No exports   were found that match the constraint:
ContractName      Microsoft.VisualStudio.Text.Operations.ITextStructureNavigatorSelectorService    
RequiredTypeIdentity      Microsoft.VisualStudio.Text.Operations.ITextStructureNavigatorSelectorService
at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition)
at Microsoft.ComponentModel.Composition.Diagnostics.CompositionInfo.AnalyzeImportDefinition(ExportProvider host, IEnumerable`1 availableParts, ImportDefinition id)    
[Import] MyVSIX.Source.MyCompletionSourceProvider.ServiceProvider (ContractName="System.IServiceProvider")
[Exception] System.ComponentModel.Composition.ImportCardinalityMismatchException: No exports were found that match the constraint: 
ContractName    System.IServiceProvider
RequiredTypeIdentity    System.IServiceProvider
at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition)
at Microsoft.ComponentModel.Composition.Diagnostics.CompositionInfo.AnalyzeImportDefinition(ExportProvider host, IEnumerable`1 availableParts, ImportDefinition id)

如果我删除 [Import] 语句,这些都将得到解决,一切都将重新开始。不过,从教程来看,这似乎应该可以正常工作。这也不能解释为什么它在我的机器上 100% 的时间都可以工作,而在任何其他机器上都不能工作。

这是我的 .vsixmanifest 文件:

<?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">
    <Metadata>
    <Identity Id="MyVSIX.Company.39048217-955a-4402-84e9-8a24f0730e72" Version="1.0" Language="en-US" Publisher="MyVSIX" />
    <DisplayName>MyVSIX</DisplayName>
    <Description xml:space="preserve"></Description>
    <Icon>Resources\MyVSIX.ico</Icon>
  </Metadata>
  <Installation>
  <InstallationTarget Id="Microsoft.VisualStudio.Community" Version="[14.0]" />
  </Installation>
  <Dependencies>
    <Dependency Id="Microsoft.Framework.NDP" DisplayName="Microsoft .NET Framework" d:Source="Manual" Version="[4.5,)" />
    <Dependency Id="Microsoft.VisualStudio.MPF.14.0" DisplayName="Visual Studio MPF 14.0" d:Source="Installed" Version="[14.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%|" />
    <Asset Type="Microsoft.VisualStudio.ItemTemplate" Path="Output\ItemTemplates" />
    <Asset Type="Microsoft.VisualStudio.ProjectTemplate" Path="Output\ProjectTemplates" />
  </Assets>
</PackageManifest>

【问题讨论】:

    标签: visual-studio visual-studio-2015 mef visual-studio-extensions vsix


    【解决方案1】:

    弄清楚为什么它不能在其他机器上运行,但我仍然无法理解它为什么在我的机器上运行。我改变了这个:

    [Import]
    internal IServiceProvider ServiceProvider { get; set; }
    

    到这里:

    [Import(typeof(SVsServiceProvider)]
    internal IServiceProvider ServiceProvider { get; set; }
    

    希望这对未来的人有所帮助 - 我花了 2 天时间解决这个问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-11
      • 1970-01-01
      相关资源
      最近更新 更多