.NET WPF デスクトップアプリ DLLが異なるバージョンのDLLを参照していた場合

問題

  • 他の人から提供されたDLLがJson.NETの4.5.0.0を参照いていた。
  • 自分のプロジェクトはNuGetで入れた時点の最新版? 6.0.0.0 を参照していた。
  • DLLのメソッドを呼び出すと何か例外が出る。
    • {"ファイルまたはアセンブリ 'Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed'、またはその依存関係の 1 つが読み込めませんでした。見つかったアセンブリマニフェスト定義はアセンブリ参照に一致しません。 (HRESULT からの例外:0x80131040)":"Newtonsoft.Json, Version=4.5.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed"}

.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>

ユニットテストで bindingRedirect が有効にならない件

  • bindingRedirect を指定することで通常の実行では、この定義が有効になる。
  • しかし、単体テストではなぜかNGで、最初の例外が発生する。
  • テストを実行するローダーのバグとか、そういうことみたい。
  • 回避策としてはユニットテストで .testsettings を選択する。
    • ソリューションを選択し、テストの設定を追加する。[追加]→[テストの設定]
    • xxxx.testsetting というファイルができる。名前は何でもいい。
    • メニューから[テスト]→[設定]→[テスト設定ファイルの選択]で作成したテスト設定ファイルを選択する。

.testsettings ファイルを使用すると、テストを実行するために MSTest のテスト フレームワークが使用されるようになります。 この場合は実行速度が遅くなり、サードパーティのテスト フレームワークからテストを実行することはできません。