2013-02-06 27 views
10

修正方法?.NET Dll Hellを解決するには?

私はNewtonSoftJson.dllを使用するサードパーティのアセンブリが2つあります。キャッチはそのうちの1つは古い3.x.xを使用し、もう1つは4.5.xを使用します。したがって、実行時には、少なくとも2つのアセンブリのうちの1つが他のアセンブリについて不平を言っています。

どうすれば解決できますか?私はサービスを設定することができましたが、コードと環境は現在そのように設定されていません。これは、指定された時間内に安全に実行できるリファクタリングでもあります。

+0

両方のアセンブリが同じディレクトリにありますか? –

+0

これは役立つかもしれません:http://blogs.msdn.com/b/abhinaba/archive/2005/11/30/498278.aspx – Oded

+1

http://stackoverflow.com/questions/3158928/referencing-2-differents-versions -of-log4net-in-the-same-solution – Oded

答えて

4

私はNewtonsoftと別のサードパーティのライブラリで正確な問題を抱えていました。 Newtonsoft v3.xとv4.xの問題は、新しいライブラリに公開鍵トークンが付属することです。これにより、アセンブリリダイレクトソリューションは役に立たなくなりました。他のほとんどのケースでは完全に有効な解決策です。

私は第三者のライブラリを自分自身で再実装しました。サードパーティライブラリのソースコードにアクセスできる場合は、新しいNewtonsoft DLLを使用してライブラリをいつでも再構築できます。メソッドのシグネチャが変更された場合は、マイナーチェンジを行う必要があります。

+0

同じ問題が発生した場合、LITTLEアプリ(Kbsの数個)をダウンロードして、私にはないフレームワークバージョンが必要です。それをインストールするには、それを自分で検索しなければなりません。それは欲求不満(バージョン地獄)につながる可能性があります。それは少しのアプリですが、その周りにうそつきが必要です。フレームワークをインストールした後、更新が必要です(無限の更新のように見えます)。これは、非常にユーザーフレンドリーで狂った方法ではないアプリを展開する。今、私はなぜWindowsがその巨大なのかを理解しています。なぜ今、世界に大胆な毛のない男性がいるのか知っています。あなたの製品に.NETを使用することを2度考えてください。 – Codebeat

3

Microsoftの記事「Redirecting Assembly Versionsは、」これは言っています

次の例では、別のmyAssembly の1つのバージョンをリダイレクトし、mySecondAssemblyために発行者ポリシーをオフにする方法を示しています。

<configuration> 
    <runtime> 
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <dependentAssembly> 
     <assemblyIdentity name="myAssembly" 
      publicKeyToken="32ab4ba45e0a69a1" 
      culture="en-us" /> 
     <!-- Assembly versions can be redirected in application, 
      publisher policy, or machine configuration files. --> 
     <bindingRedirect oldVersion="1.0.0.0" newVersion="2.0.0.0" /> 
     </dependentAssembly> 
     <dependentAssembly> 
     <assemblyIdentity name="mySecondAssembly" 
     publicKeyToken="32ab4ba45e0a69a1" 
     culture="en-us" /> 
     <!-- Publisher policy can be set only in the application 
      configuration file. --> 
     <publisherPolicy apply="no" /> 
     </dependentAssembly> 
    </assemblyBinding> 
    </runtime> 
</configuration> 
+2

'NewtonSoftJson'の異なるバージョンに依存しているアセンブリは、正しいバージョンを取得しますか? – Oded

+0

@Oded:できません。私は今これを探検する時間がない。おそらく今週末。 –

2

通常、アプリ/ウェブconfigのコンフィギュレーションを介してこれを解決します。プロービング要素を使用してプライベートパスを指定し、2つのバージョンを別々のフォルダに置くことができます。

<configuration> 
    <runtime> 
     <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> 
     <probing privatePath="bin;bin2\subbin;bin3"/> 
     </assemblyBinding> 
    </runtime> 
</configuration> 

もう1つの方法は、アセンブリバインディングリダイレクトを使用することです。しかし、バージョンが互換性があることが分かっている場合にのみ動作します。あなたがそれらを直接使用しているわけではないので、あなたはそれを知っているとは確信していませんし、パブリッシャーはアセンブリバージョンを変更することによっていくつかの非互換性を示しています。

1

デコンパイラを使用して終了し、ソリューションにプロジェクトを追加し、新しいdllを参照し、バグを修正して、再コンパイルして、最近追加されたプロジェクトをポイントします。

パブリックキートークンが変更されたため、アセンブリのリダイレクトを使用できませんでした。明らかに、参照されたアセンブリのうちの1つをコンパイルするために、異なるキーが使用されました。より徹底した措置に頼らなければならなかった。

関連する問題