web-dev-qa-db-ja.com

同じアセンブリの複数のバージョンをロードする

サードパーティのアセンブリを使用していますが、残念ながら、最新バージョンと以前のバージョンをプロジェクトにロードする必要があるので、実行時にロードするバージョンを決定できます。両方は必要ありません。

これを念頭に置いて、私はコンポーネントによって提供されるタイプにも依存しているので、使用したいメソッド/イベント/インターフェースをリフレクションからロードして毎回クエリすることはできません。 AppDomainsを介してこれを処理することについてのいくつかの言及を見ましたが、続行する方法がわかりません。

プロセスは、コンポーネントの1つのバージョンに対してコード化し、実行時に(AppDomainを使用して)正しいDLLでスワップする)ために消費されますか?それで、私は起動時にのみこれを処理しますか?

18
GT.

両方のアセンブリに互換性がある場合は、bindingRedirectを宣言することにより、常に新しいバージョンを使用するようにapp.exe.configまたはweb.configファイルで定義できます。

<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1" appliesTo="v1.0.3705">
        <dependentAssembly>
            <assemblyIdentity name="Regcode" publicKeyToken="b03f5f7f11d50a3a" culture=""/>
            <bindingRedirect oldVersion="0.0.0.0-65535.65535.65535.65535" newVersion="1.0.3300.0"/>
        </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

dotnet 1.0のこの構成エントリは、何が呼び出し元のexeにコンパイルされているかに関係なく、常にバージョン1.0.3300.0を使用するようにアセンブリローダーに指示します。新しいdotnetバージョンでも同じことが可能です

13
k3b

SO)からの同じアセンブリの複数のバージョンをロードする方法を説明するいくつかの投稿を次に示します。

この記事では、log4netの2つの異なるバージョンを参照する方法について説明します。彼が問題をどのように解決したかについての詳細については、受け入れられた回答の下の@Joe B.のコメントを参照してください。

サードパーティのライブラリはlog4net.dllの異なるバージョンを参照

その答えはこのリンクを参照しています:

同じフォルダー内の同じアセンブリの異なるバージョンを使用

このスレッド内では、同じコンテキストで同じアセンブリの異なるバージョンをロードすることに関する警告があり、MSDNでこのリンクを参照しています。

http://msdn.Microsoft.com/en-us/library/dd153782.aspx#avoid_loading_multiple_versions

これは、AssemblyResolveの使用を提案する回答付きの別のものです: 2つの等しいアセンブリを参照し、公開鍵のみが異なります

5
wageoghe

同じコンポーネントの2つの異なるバージョンがある場合、これは両方のバージョンが実装だけでなく、それらが公開する操作の数も異なる可能性があることを意味しますか?これが事実である場合、一部の機能が2つのバージョンのいずれかにのみある場合、どのようにバージョンを切り替えることができますか?

とにかく、2つのバージョンをロードする場合は、2つの別々のアプリケーションドメインで実行する必要があります。これは、後で不要なバージョンをアンロードできるためです。次に、 アプリケーションドメインを作成してアプリケーションを実行するにはどうすればよいですか? で説明されているように、正しいアプリケーションドメインでロジックを実行できます。

0
L-Four

ソリューションのブログエントリがあります ここ 、これも参照してくださいSOスレッド 同じアセンブリの異なるバージョンをロードする

0
BrokenGlass