.NET WPF デスクトップアプリ DLLが異なるバージョンのDLLを参照していた場合
問題
- 他の人から提供されたDLLがJson.NETの4.5.0.0を参照いていた。
- 自分のプロジェクトはNuGetで入れた時点の最新版? 6.0.0.0 を参照していた。
- DLLのメソッドを呼び出すと何か例外が出る。
.csproj の は関係ない?
- 例外のメッセージで検索すると、プロジェクトファイル.csproj の
という設定が出てくるけど、これは.NET Frameworkのリダイレクトのこと? - とりあえず、問題の解決には関係なかった。
- 方法: 自動バインディング リダイレクトを有効/無効にする
http://msdn.microsoft.com/ja-jp/library/2fc472t2(v=vs.110).aspx
App.config の で解決
- App.config に
の を定義するといいらしい。 - 4.5.0.0を使おうとしても、6.0.0 を使わせてしまうというような指定っぽい。
- oldVersionは範囲指定できるので、一括して指定しておくと便利っぽい。
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" /> <bindingRedirect oldVersion="0.0.0.0-4.5.0.0" newVersion="6.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
要素
http://msdn.microsoft.com/ja-jp/library/eftw1fys(v=vs.110).aspx- .net - Assembly Conflict with Newtonsoft.Json - Stack Overflow
http://stackoverflow.com/questions/19225776/assembly-conflict-with-newtonsoft-json
ユニットテストで bindingRedirect が有効にならない件
- bindingRedirect を指定することで通常の実行では、この定義が有効になる。
- しかし、単体テストではなぜかNGで、最初の例外が発生する。
- テストを実行するローダーのバグとか、そういうことみたい。
- why does assemblybinding work only if .testsettings file is used? (VS2012RC)
http://social.msdn.microsoft.com/Forums/vstudio/en-US/234926d1-42c0-4ebb-af39-1626e72f6c39/why-does-assemblybinding-work-only-if-testsettings-file-is-used-vs2012rc?forum=vsunittest
- 回避策としてはユニットテストで .testsettings を選択する。
- ソリューションを選択し、テストの設定を追加する。[追加]→[テストの設定]
- xxxx.testsetting というファイルができる。名前は何でもいい。
- メニューから[テスト]→[設定]→[テスト設定ファイルの選択]で作成したテスト設定ファイルを選択する。
- 以下のような副作用があるそうだが、致し方なし。
- Visual Studio のテストにおけるテスト設定の指定
http://msdn.microsoft.com/ja-jp/library/ee256991.aspx
.testsettings ファイルを使用すると、テストを実行するために MSTest のテスト フレームワークが使用されるようになります。 この場合は実行速度が遅くなり、サードパーティのテスト フレームワークからテストを実行することはできません。