0

私はMEFについて少し難問を抱えています。

MEF を使用して個々のインストーラー コンポーネントをロードするインストーラーおよび構成アプリケーション シェルがあります。これにより、エンド ユーザーは、インストール配布可能ファイルに配置されたコンポーネントから選択することができます。

これを使用するために作成された最初のインストール コンポーネントは、バージョン 11 の SQLServer SMO ライブラリを使用していました。2008R2 または 2012 に対してインストールすると正常に動作します。(これをコンポーネント A と呼びましょう)

別のチームがコードを新しいコンポーネントに移行していますが、そのコードはバージョン 10 の SQLServer SMO、RMO、および SSIS (DTS) ライブラリを使用しています。(これをコンポーネント B と呼びましょう)

MEF がコンポーネント BI を読み込もうとすると、SQLServer DLL の 1 つ (Microsoft.SqlServer.Replication) に対して LoaderExceptionFailure が発生します。実際には FileNotFoundException (DLL のリスト) が発生します。DLL は、コンポーネントのディレクトリに存在します。正しいバージョンは 10 です。

シェル アプリケーションには、既にバージョン 11 のファイルが含まれています。

アプリケーションコンテキストに何をすべきかを伝える方法はありますか? コンポーネントに必要な特定のライブラリをロードするように指示する方法はありますか?

各コンポーネントが「Associated.Library、Version=1.0.0.0、publickey=abcdef123456789、culture=none」を指定できると仮定したいと思います。

4

1 に答える 1

1

CLR (MEF ではない) がアセンブリを見つけられない理由は、それが GAC にも、現在の AppDomain がアセンブリをプローブするようにセットアップされている場所にもないためです。

この種の問題に対処する 1 つの方法は、不足しているアセンブリを GAC に追加することです。

もう 1 つの方法は、不足しているアセンブリを含むフォルダーをアプリケーションのプローブ パスに追加することです。これらのアセンブリをアプリケーションのベース フォルダー (実行可能ファイルを含むフォルダー) にデプロイしてもかまわない場合は、そうしてください。それ以外の場合は、アプリケーション ベース フォルダーのサブ フォルダーにデプロイを追加し、そのフォルダーを app.config のprivatePath要素に追加できます。

詳細については、記事「ランタイムがアセンブリを検索する方法」を参照してください。

于 2013-08-18T13:02:26.497 に答える