67

次のような状況があります

プロジェクトA

 - Uses Castle Windsor v2.2
 - Uses Project B via WindsorContainer

プロジェクトB

 - Uses NHibernate
 - Uses Castle Windsor v2.1

プロジェクト AI の bin フォルダーには、dll Castle.DynamicProxy2.dll v2.2 および NHibernate dll があります。問題は、NHibernate がそこにない Castle.DynamicProxy2.dll v2.1 に依存していることです。この状況を解決するにはどうすればよいですか。

4

3 に答える 3

96

問題を解決するために、次の構成を使用しました。

<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Castle.DynamicProxy2" publicKeyToken="407dd0808d44fbdc" />
                <codeBase version="2.1.0.0" href="v2.1\Castle.DynamicProxy2.dll" />
                <codeBase version="2.2.0.0" href="v2.2\Castle.DynamicProxy2.dll" />
            </dependentAssembly>
            <dependentAssembly>
                <assemblyIdentity name="Castle.Core" publicKeyToken="407dd0808d44fbdc" />
                <codeBase version="1.1.0.0" href="v2.1\Castle.Core.dll" />
                <codeBase version="1.2.0.0" href="v2.2\Castle.Core.dll" />
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>
于 2010-03-17T11:20:02.113 に答える
11

非常に、非常に、非常に重要なことの 1 つは、十分な注意を払わないと見逃してしまう可能性があることです。

codeBase バージョン タグに記述するアセンブリには、厳密な名前を付ける必要があります。

次のリンクから: http://msdn.microsoft.com/en-us/library/efs781xb.aspx

厳密な名前のないアセンブリの場合、バージョンは無視され、ローダーは <dependentAssembly> 内の <codebase> の最初の外観を使用します。バインドを別のアセンブリにリダイレクトするエントリがアプリケーション構成ファイルにある場合、アセンブリのバージョンがバインド要求と一致しない場合でも、リダイレクトが優先されます。

于 2013-09-20T16:24:41.507 に答える
9

1 つの解決策 (または回避策) は、ソフトウェアを実行する必要があるコンピューターのグローバル アセンブリ キャッシュ(GAC) に両方のバージョンをインストールし、厳密な名前を使用してアセンブリを参照することです。これは、アセンブリが実際に厳密な名前を持っていることを前提としています。

少数の開発者がいる場合、またはソリューションを多数のコンピューターに展開する予定がある場合 (エンドユーザー アプリケーションなど)、GAC へのインストールは面倒です。この場合、唯一の選択肢は、2 つのバージョンのいずれかをそのバージョンを必要とするアセンブリにマージすることだと思います (間違っているかもしれません) 。Castle.DynamicProxy2.dll特定のケースでは、 v2.1 を にマージする必要がありますNHibernate.dll

ILMergeというツールを使用して、アセンブリをマージできます。実行する必要があるコマンドは次のようになります (未テスト):

ILMerge /t:library /internalize /out:Deploy/NHibernate.dll
    NHibernate.dll Castle.DynamicProxy2.dll

この/internalizeスイッチは、出力アセンブリの 2 番目のアセンブリ (この場合は Castle) のすべての型をマークするように ILMerge に指示しinternalます。NHibernate.dllこれがないと、v2.2 の新しいバージョンとシェルフ バージョンの両方を参照するプロジェクトをコンパイルしようとするCastle.DynamicProxy2.dllと、まったく同じ名前のクラスが含まれるため、コンパイル エラーが発生する可能性があります。

于 2010-03-17T08:01:59.060 に答える