web-dev-qa-db-ja.com

テーブルストレージを使用してAzure Cloud WorkerロールでファイルまたはアセンブリMicrosoft.Data.OData Version = 5.2.0.0エラーをロードできませんでした

Azure Table Storageの使用に非常に特有の問題があります。 Visual Studio 2012に.NET 4.5プロジェクトがあり、すべてのAzureテーブルストレージ機能を処理しています。このプロジェクト/ dllは、MVC WebサイトとAzureワーカーロールの2つの他のプロジェクトによって参照されます。 (私は自分のマシンのAzure Emulatorsの下で実行していますが、クラウドにデプロイするときにも発生します)

レコードを保存または取得するときに呼び出される次の関数があります。

internal static CloudTable GetTable(CloudStorageAccount storageAccount, string tableReference)
{
    CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

    CloudTable table = tableClient.GetTableReference(tableReference);
    table.CreateIfNotExists();

    return tableClient.GetTableReference(table.Name);
}

私のMVC Webサイトには、Azure Storageテーブルにレコードを保存する機能があり、Azure Workerロールにはレコードを読み取るサービスがあります。

したがって、どちらも同じDLLをストレージと取得に使用しますが、MVCプロジェクトではレコードの保存に問題はありませんが、Azure Workerロールサービスでレコードを取得しようとすると、「table.CreateIfNotExExists()」を実行しようとすると例外がスローされます; "。

ファイルまたはアセンブリ「Microsoft.Data.OData、Version = 5.2.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35」またはその依存関係の1つをロードできませんでした。検出されたアセンブリのマニフェスト定義は、アセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)

私はすでに以下を行っています:

  1. すべてのNuGetパッケージをソリューションレベルから最新バージョンに更新しました
  2. すべてのプロジェクトリファレンスを調べて、古いDLLや以前のバージョン、特にSystem.Spatial、Microsoft.WindowsAzure.Configuration、Microsoft.WindowsAzure.ServiceRuntime、Microsoft.ServiceBus、Microsoft.WindowsAzure.Storageがぶら下がっていないことを確認しました。 Microsoft.Data.EdmおよびMicrosoft.Data.OData
  3. 新しいCloud ServiceとWorkerRoleプロジェクトを最初から作成し、現在のWorkerRoleプロジェクト内で破損していないことを確認しました。

5.3以降の特定の機能を使用する他のプロジェクトで問題が多すぎたため、dllを5.2にロールバックしていません。

現在、すべてのDLLを5.5で実行しています。

here で見つかったAsmSpy.exeユーティリティを実行すると、解釈方法が100%確実ではないという次の出力が表示されます。

> Reference: Microsoft.Data.Edm
>         5.5.0.0 by Microsoft.Data.OData
>         5.5.0.0 by Microsoft.Data.Services.Client
>         5.5.0.0 by Microsoft.WindowsAzure.ActiveDirectory.GraphHelper.2013_04_05
> Reference: System.Spatial
>         5.5.0.0 by Microsoft.Data.OData
>         5.5.0.0 by Microsoft.Data.Services.Client Reference: Microsoft.Data.OData
>         5.5.0.0 by Microsoft.Data.Services.Client
>         5.2.0.0 by Microsoft.WindowsAzure.Storage   <-- THIS SEEMS TO BE THE ONE THAT IS CAUSING ISSUES

Microsoft.WindowsAzure.Storage dllはMicrosoft.Data.OData dllのV 5.2.0.0を参照していますが、これが問題である場合、どうすれば修正できますか? Storage dllで私が見たドキュメントによると、それは5.2ではなく5.4以上を参照するはずです...?

37
Ryk

このような簡単に解決できる問題の問題を解決しても、役に立ちません。

それぞれの構成ファイルに次の追加構成を追加します(MVCのweb.configおよびworkerロールのapp.config):

 <runtime>
    <assemblyBinding xmlns="urn:schemas-Microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.OData" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="Microsoft.Data.Edm" publicKeyToken="31bf3856ad364e35" culture="neutral" />
        <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
      </dependentAssembly>
    </assemblyBinding>
  </runtime>

runtimeセクションはconfigurationルート要素の直接の子孫であることに注意してください! MVC4はSystem.Web.MVCへのすべての参照を最新バージョンに再バインドするために使用するため、web.configにこのセクションが既にあると確信しています。

個人的には、SDKがすべての参照ライブラリのすべての新しいバージョンで更新されることを期待していません!これは狂気でしょう...

40
astaykov

私は非常に似た問題を抱えていましたが、この場合は例外メッセージがありました。

ファイルまたはアセンブリ「Microsoft.Data.OData、Version = 5.5.0.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35」またはその依存関係の1つをロードできませんでした。検出されたアセンブリのマニフェスト定義は、アセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)

oDataアセンブリv5.5.0.0をロードしようとしていたことに注意してください。

ILSpy( http://www.ilspy.net )を掘り下げた後、Microsoft.WindowsAzure.Storage 2.0.0.0が明示的にMicrosoft.Data.OData 5.2.0.0を参照していることを発見しました。私のバージョンが5.5.0.0だったので持っていません。

そのため、ソリューションはNuGetパッケージマネージャーを使用してMicrosoft.WindowsAzure.Storageをアンインストールすることでした。これにより、Microsoft.Data.OData 5.5がアンインストールされました。次に、NuGetパッケージマネージャーを使用して、Microsoft.Windows.Azure.Storageを再インストールします。

そして実用的なソリューションに戻ります。

16
Ben Whittle

パッケージを更新するか、NuGetを介して新しいパッケージを追加すると、「ファイルまたはアセンブリをロードできませんでした...」という問題が発生するたびに、一般にこの問題を解決できます。

Package Manager ConsoleVS 2012 Tools/Library Package Manager/Package Manager Console)を開きます。パッケージマネージャーコンソールのシェルが開いたら、次のコマンドを実行します。

Add-BindingRedirect

注:NugGetの例では、例の最後に「s」が追加され、Add-BindingRedirectは有効なコマンドではありません。

これは次のことを行います。

プロジェクトの出力パスにあるすべてのアセンブリを調べ、必要に応じてアプリケーション構成(app.config)ファイルまたはWeb構成(web.config)ファイルにバインディングリダイレクトを追加します。

Package Manager Consoleの完全なドキュメントは、次の場所にあります。 http://nuget.codeplex.com/wikipage?title=Package%20Manager%20Console%20Command%20Reference%20(v1.3)

Astaykovの回答にある2つのエントリに加えて、以下も私のプロジェクトに追加されました。

  <dependentAssembly>
    <assemblyIdentity name="System.Spatial" publicKeyToken="31bf3856ad364e35" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
  </dependentAssembly>
10
eesh

今日も同様の問題がありました。私が見つけた唯一の違いは、クラウドアプリがVersion =5.2.0.0でMicrosoft.Data.ODataを探していた(そして見つけられなかった)ことです。

Visual Studio Object Browserを使用して、私のソリューションがその場所のライブラリを使用していることがわかりました:

C:\ Program Files(x86)\ Microsoft WCF Data Services\5.0\bin\.NETFramework

そこにあるMicrosoft.Data.ODataライブラリはver。 5.0.0.0そのため、5.2.0.0で上書きすると問題が解決しました。

追伸この問題を解決するために、Windowsストアアプリ用のWCFデータサービスツールを以前にインストールしたため、アプリケーションが別のソースから取得する可能性があります。その場合、次の2つのオプションがあります。

  1. here からWindowsストアアプリ用のWCFデータサービスツールをインストールし、上記のソリューションを使用します。

  2. Visual Studio Object Browserを使用して、プロジェクトで現在表示されているODataライブラリのバージョンと保存場所を確認します。次に、それらの不適切なバージョンを上書きする必要があります。

1
Szymon Drosdzol

同様の問題もありましたが、Azureを使用していなかったため、5.2を指すハードコードされた参照はありませんでした。しかし、.svcのテキストが正しいアセンブリを指していることを確認することで、( この記事 を見つけた後)解決しました。

<%@ ServiceHost Language="C#"
      Factory="System.Data.Services.DataServiceHostFactory,
      Microsoft.Data.Services, Version=5.6.0.0,
      Culture=neutral, PublicKeyToken=31bf3856ad364e35"

Service = "MVC4WCFDataServiceFE5.NorthWindService"%>

Version = 5.6.0.0に注意してください。これは以前にはありませんでした。

0
Scott Stafford