0

我正在編寫一個VS 2012插件,其中包含一個Package以及一個IWpfTextViewCreationListenerMEF擴展類。Visual Studio擴展MEF類未通過MSI安裝時實例化

它使用WiX項目創建的MSI進行安裝,將所有文件放置在C:\Program Files\...[Application];它創建Packages註冊表項以指向包含Package實現的DLL。

在實驗性Visual Studio實例中調試插件時,所有內容都正常運行。

運行MSI安裝程序時,程序包代碼運行正常,但未實例化MEF類。

注意:如果我使用VSIX(我不用於MSI安裝)安裝軟件包,一切都正常。

的MEF類(在相同的集合作爲包裝):

[Export(typeof (IWpfTextViewCreationListener))] 
[ContentType("text")] 
[TextViewRole(PredefinedTextViewRoles.Document)] 
internal sealed class HighlightAdornerFactory : IWpfTextViewCreationListener 
{ 
    [Import] 
    public IClassificationTypeRegistryService ClassificationRegistry = null; 

    [Import] 
    public IClassificationFormatMapService FormatMapService = null; 

    [Export(typeof (AdornmentLayerDefinition))] 
    [Name(HighlightAdornment.Name)] 
    [Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)] 
    public AdornmentLayerDefinition editorAdornmentLayer = null; 
public void TextViewCreated(IWpfTextView textView) 
    { /** ... **/ } 
} 

我以前VisualMEFX檢查,這是打包在DLL據報道,沒有出口匹配IClassificationTypeRegistryService。這並不能解釋爲什麼當它與VSIX一起安裝時,或者通過IDE進行調試。但是在解決問題時可能很有用。

[Export] MySolution.HighlightAdornerFactory (ContractName="Microsoft.VisualStudio.Text.Editor.IWpfTextViewCreationListener") 
    [Export] MySolution.Adornment.HighlightAdornerFactory.editorAdornmentLayer (ContractName="Microsoft.VisualStudio.Text.Editor.AdornmentLayerDefinition") 
    [Import] MySolution.Adornment.HighlightAdornerFactory.ClassificationRegistry (ContractName="Microsoft.VisualStudio.Text.Classification.IClassificationTypeRegistryService") 
    [Exception] System.ComponentModel.Composition.ImportCardinalityMismatchException: No exports were found that match the constraint: 
    ContractName Microsoft.VisualStudio.Text.Classification.IClassificationTypeRegistryService 
    RequiredTypeIdentity Microsoft.VisualStudio.Text.Classification.IClassificationTypeRegistryService 
    at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition) 
    at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition) 
    at Microsoft.ComponentModel.Composition.Diagnostics.CompositionInfo.AnalyzeImportDefinition(ExportProvider host, IEnumerable`1 availableParts, ImportDefinition id) in C:\Temp\MEF_Beta_2\Samples\CompositionDiagnostics\Microsoft.ComponentModel.Composition.Diagnostics\CompositionInfo.cs:line 157 
    [Import] MySolution.HighlightAdornerFactory.FormatMapService (ContractName="Microsoft.VisualStudio.Text.Classification.IClassificationFormatMapService") 
    [Exception] System.ComponentModel.Composition.ImportCardinalityMismatchException: No exports were found that match the constraint: 
    ContractName Microsoft.VisualStudio.Text.Classification.IClassificationFormatMapService 
    RequiredTypeIdentity Microsoft.VisualStudio.Text.Classification.IClassificationFormatMapService 
    at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition, AtomicComposition atomicComposition) 
    at System.ComponentModel.Composition.Hosting.ExportProvider.GetExports(ImportDefinition definition) 
    at Microsoft.ComponentModel.Composition.Diagnostics.CompositionInfo.AnalyzeImportDefinition(ExportProvider host, IEnumerable`1 availableParts, ImportDefinition id) in C:\Temp\MEF_Beta_2\Samples\CompositionDiagnostics\Microsoft.ComponentModel.Composition.Diagnostics\CompositionInfo.cs:line 157 

我已經嘗試從我的程序集中添加所有引用的庫到MSI,但這沒有幫助。我沒有看到任何例外情況,IWpfTextViewCreationListener類完全沒有加載。

回答

2

你看到的行爲是通過設計;只有在某個地方的.vsixmanifest中列出了MEF組合時,它們纔會包含在MEF組合中。當您通過MSI添加包註冊表項時,這不會將您的程序集添加到MEF組合中。您是在什麼時候在實驗配置單元中進行測試或直接安裝擴展模塊的,那麼您可以像預期的那樣將您的部件包含到MEF組合中。

你有幾個方法來解決這個問題,在我的推薦順序:

  1. 不要使用MSI。如果可能,我強烈鼓勵。 VSIX非常強大,爲用戶提供了許多優勢:它們更容易安裝和卸載,並且與擴展管理器和Visual Studio庫集成。除非你能證明VSIX對於你的場景是不可接受的,請使用它們。

  2. 使用WiX 3.6,它有一個VsixPackage元素,它可以爲你安裝VSIX。該文檔可用here

  3. 讓您的MSI將VSIX的內容安裝到[Program Files] \ Microsoft Visual Studio 11.0 \ Common7 \ IDE \ Extensions \ [您的產品名稱]中,然後運行devenv/setup作爲自定義操作的一部分。這樣做非常棘手,需要大量的手動WiX創作。選項#2的存在是有原因的 - WiX人真的知道他們在做什麼。 ;-)

+0

謝謝傑森。我昨天晚上發現了wix VsixPackage元素,並且會給你一個鏡頭。我很欣賞這種迴應。 –

相關問題