34

A がアセンブリ B 1.1 と C を参照し、C が B 1.2 を参照している場合、アセンブリの競合をどのように回避しますか?

私は、C の参照がカプセル化され、問題が発生しないと思っていましたが、すべての dll が問題が発生するビンにコピーされているようです。

これを回避する2つの方法は、GACまたはアセンブリバインディングを使用することだと理解していますか? GAC は私にとって最善のアプローチとは思えません。dll がそこにあると仮定するのは好きではないため、ソリューションの lib ディレクトリから dll を参照することを好みます。

アセンブリ バインディングは堅牢ではないように思えますが、アセンブリの 1 つのバージョンが他のバージョンにはない機能を持っている場合、問題は発生しませんか?


私の場合、サードパーティのdllを使用しているため、自分で使用しているよりも古いバージョンのnHibernateを使用しています。

4

5 に答える 5

9

私は過去に GAC を使用して同じ結果を達成しましたが、複数のバージョンを参照しなければならない理由を疑問視し、可能であれば回避するようにしてください。あなたがそれをしなければならない場合、バインディングリダイレクトがあなたの場合に役立つかもしれません.

また、これはもう読みましたか?

于 2008-10-21T19:45:17.010 に答える
6

これを行うためのあまり知られていない方法は、extern キーワードを使用することです。

C #リファレンスより

同じ完全修飾型名を持つ 2 つのアセンブリを参照するには、次のようにコマンド プロンプトでエイリアスを指定する必要があります。

/r:GridV1=grid.dll

/r:GridV2=grid20.dll

これにより、外部エイリアス GridV1 および GridV2 が作成されます。プログラム内からこれらのエイリアスを使用するには、extern キーワードを使用してそれらを参照します。例えば:

extern エイリアス GridV1;

extern エイリアス GridV2;

各 extern エイリアス宣言は、グローバル名前空間に対応する (ただし、内部には存在しない) 追加のルートレベルの名前空間を導入します。したがって、各アセンブリの型は、適切な名前空間エイリアスをルートとする完全修飾名を使用して、あいまいさなく参照できます。

前の例では、GridV1::Grid は grid.dll からのグリッド コントロールになり、GridV2::Grid は grid20.dll からのグリッド コントロールになります。

于 2011-08-23T21:03:03.153 に答える
3

アセンブリの複数のバージョンをサポートする必要があり、この解決策を見つけました:

  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="MyAssembly" publicKeyToken="..." />
        <codeBase version="1.1.0.0" href="MyAssembly_v1.1.0.0.dll"/>
        <codeBase version="2.0.0.0" href="MyAssembly_v2.0.0.0.dll"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
于 2013-08-01T19:37:46.897 に答える
1

.NET ランタイムは、同じアセンブリの複数のバージョンを同時に完全にロードできます。ただし、このワームの缶を開ける場合は、名前の競合を避けるために、アセンブリに厳密な名前を付け、Major.Minor.* 命名スキームを使用することを強くお勧めします。

GAC を使用する (または使用しない) ための画一的なアプローチを考える必要はないと思います。将来のバージョンの DLL で公開される新しい機能を自動的に使用したい場合、GAC は非常に便利です。もちろん、この祝福には、新しいバージョンが期待どおりに機能しない可能性があるという代償が伴います:)。それはすべて、最も実用的なものと、GAC に公開されるものをどれだけ制御できるかの問題です。

よろしく、 -アラン。

于 2008-10-21T20:04:44.210 に答える
1

構成ファイルにbindingRedirect 要素を追加して、実行時に使用するアセンブリのバージョンを指定できます。

<configuration>
   <runtime>
      <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
         <dependentAssembly>
            <assemblyIdentity name="myAssembly"
                              publicKeyToken="32ab4ba45e0a69a1"
                              culture="neutral" />
            <bindingRedirect oldVersion="1.0.0.0"
                             newVersion="2.0.0.0"/>
         </dependentAssembly>
      </assemblyBinding>
   </runtime>
</configuration>
于 2008-10-21T19:59:59.117 に答える