web-dev-qa-db-ja.com

エラー:ファイルまたはアセンブリを読み込めませんでした 'Microsoft.Practices.ServiceLocation、Version = 1.0.0.0

このエラーが発生します:

ファイルまたはアセンブリ 'Microsoft.Practices.ServiceLocation、Version = 1.0.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35'またはその依存関係の1つを読み込めませんでした。見つかったアセンブリのマニフェスト定義がアセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)

プロジェクトに別の既存のバージョンのMicrosoft.Practices.ServiceLocationがある場合、アセンブリリダイレクトバインディングを使用してこれを解決するにはどうすればよいですか?

12
Contango

1つの方法は、すべてのNuGetパッケージを再コンパイルして、同じバージョンのMicrosoft.Practices.ServiceLocationを使用することです。実用的なレベルでは、これは実用的ではありません。より簡単な方法が必要です。

より良い方法は、アセンブリバインディングリダイレクトを使用することです。インターフェイスが同じであれば、これは非常にうまく機能します。このソリューションは試行錯誤されており、多くの企業で本番環境で実行されています [〜#〜] ftse [〜#〜]

App.configは次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Practices.ServiceLocation" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-1.2.0.0" newVersion="1.2.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

ターゲットバージョンを、既存のバージョン(通常は1.2.0.0または1.3.0.0)に調整します。

PublicKeyTokenはターゲットアセンブリと一致する必要があります。次のコマンドを使用して抽出できます。

sn.exe -T Assembly.dll

例:

C:\test>"C:\Program Files (x86)\Microsoft SDKs\Windows\v8.0A\bin\NETFX 4.0 Tools\x64\sn.exe" -T  C:\svn\lib\TargetDll.dll

Microsoft (R) .NET Framework Strong Name Utility  Version 4.0.30319.17929
Copyright (c) Microsoft Corporation.  All rights reserved.

Public key token is ac3efa7c033c2bd5
c:\test>

PublicKeyTokenを取得する他の方法については、 。NetアセンブリのPublicKeyTokenの取得 を参照してください。

PublicKeyTokenは、アセンブリのバージョンによって変更されません。アセンブリがv1.0.0.0またはv2.0.0.0の場合も同じです。

8
Contango