19

私はサードパーティのアセンブリを使用していますが、残念ながら、実行時にどちらをロードするかを決定できるように、最新バージョンと以前のバージョンを自分のプロジェクトにロードする必要があります。両方ではなく、1つだけが必要です。

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

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

4

4 に答える 4

15

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

<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 バージョンでも同じことが可能です

于 2010-12-15T16:18:53.857 に答える
6

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

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

サードパーティのライブラリは、さまざまなバージョンの log4net.dll を参照しています

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

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

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

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

AssemblyResolve の使用を提案する別の回答を次に示します 。2 つの等しいアセンブリを参照します。公開キーのみが異なります。

于 2010-12-15T15:43:26.300 に答える
0

ここに解決策を記載したブログ エントリがあります。また、この SO スレッドLoading different versions of the same assemblyも参照してください。

于 2010-12-15T15:44:00.280 に答える
0

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

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

于 2010-12-15T15:32:04.810 に答える