0

拡張クラスPackageだけでなく、を含むVS2012プラグインを作成しています。IWpfTextViewCreationListener MEF

これは、MSIで作成されたWiXプロジェクトを使用してインストールされ、すべてのファイルをC:\Program Files\...[Application];に配置します。これにより、Package実装を含むDLLを指すPackagesレジストリエントリが作成されます。

実験的なVisualStudioインスタンスでプラグインをデバッグする場合、すべてが正しく実行されます。

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)
    { /** ... **/ }
}

これがパッケージ化されているDLLを調べていVisualMEFXました。これは、一致するエクスポートがないことを報告し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ません。クラスがロードされないだけです。

4

1 に答える 1

2

表示されている動作は仕様によるものです。アセンブリは、.vsixmanifest のどこかにリストされている場合にのみ、MEF コンポジションに含まれます。MSI を使用して Package レジストリ キーを追加した場合、アセンブリは MEF コンポジションに追加されません。実験的なハイブでテストしたり、拡張機能を直接インストールしたりしていたとき、期待どおりにアセンブリを MEF コンポジションに含めていました。

これを修正するには、いくつかの方法があります。私の推奨順に示します。

  1. MSI を使用しないでください。可能であれば、これを強くお勧めします。VSIX は非常に強力で、インストールとアンインストールが簡単で、拡張機能マネージャーおよび Visual Studio ギャラリーと統合されているなど、ユーザーに多くの利点を提供します。VSIX がシナリオに受け入れられないことを証明できない限り、それらを使用してください。

  2. VSIX をインストールする VsixPackage 要素を持つ WiX 3.6 を使用します。ドキュメントはこちらから入手できます。

  3. MSI で VSIX のコンテンツを [Program Files]\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\[製品名] にインストールし、カスタム アクションの一部として devenv /setup を実行します。これを行うのは非常にトリッキーで、大量の手動の WiX オーサリングが必要です。オプション #2 が存在するのには理由があります。WiX 関係者は、自分たちが何をしているのかを実際に知っています。;-)

于 2012-09-20T00:40:52.727 に答える