webentwicklung-frage-antwort-db.com.de

Datei oder Assembly Microsoft.Data.OData Version = 5.2.0.0-Fehler in Azure Cloud Worker-Rolle mit Tabellenspeicher konnte nicht geladen werden

Ich habe ein sehr spezielles Problem bei der Verwendung von Azure Table Storage. Ich habe ein .NET 4.5-Projekt in Visual Studio 2012, in dem ich mich mit allen Azure Table Storage-Funktionen befasse. Auf dieses Projekt/diese DLL wird von zwei anderen Projekten verwiesen, meiner MVC-Website und meiner Azure Worker-Rolle. (Ich arbeite unter den Azure-Emulatoren auf meinem Computer, aber es passiert auch, wenn ich es in der Cloud bereitstelle.)

Ich habe die folgende Funktion, die beim Speichern oder Abrufen eines Datensatzes aufgerufen wird:

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

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

    return tableClient.GetTableReference(table.Name);
}

Auf meiner MVC-Website gibt es eine Funktion, mit der ein Datensatz in einer Azure-Speichertabelle gespeichert wird, und in meiner Azure-Worker-Rolle gibt es einen Dienst, der den Datensatz liest.

Daher verwenden beide dieselbe DLL zum Speichern und Abrufen. In meinem MVC-Projekt treten jedoch keine Probleme beim Speichern des Datensatzes auf. Beim Abrufen des Datensatzes wird jedoch in meinem Azure Worker-Rollendienst die Ausnahme ausgelöst, wenn versucht wird, "table.CreateIfNotExists ()" auszuführen. ; ".

Datei oder Assembly 'Microsoft.Data.OData, Version = 5.2.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die Manifestdefinition der lokalisierten Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040)

Folgendes habe ich schon gemacht:

  1. Alle NuGet-Pakete von der Lösungsebene auf die neuesten Versionen aktualisiert
  2. Ich habe jede Projektreferenz durchgesehen, um sicherzustellen, dass keine alten DLLs oder früheren Versionen hängen, insbesondere das System.Spatial, Microsoft.WindowsAzure.Configuration, Microsoft.WindowsAzure.ServiceRuntime und Microsoft.ServiceBus, Microsoft.WindowsAzure.Storage. Microsoft.Data.Edm & Microsoft.Data.OData
  3. Ich habe sogar ein neues Cloud-Dienst- und WorkerRole-Projekt von Grund auf erstellt, um sicherzustellen, dass das aktuelle WorkerRole-Projekt nicht fehlerhaft ist.

Ich habe die DLLs nicht auf 5.2 zurückgesetzt, da ich zu viele Probleme in anderen Projekten hatte, in denen ich Funktionen verwende, die ab 5.3 spezifisch sind.

Ich lasse zZ alle DLLs auf 5.5 laufen.

Wenn ich das Hilfsprogramm AsmSpy.exe ausführe, das hier gefunden wurde, erhalte ich die folgende Ausgabe, bei der ich nicht 100% sicher bin, wie ich sie interpretieren soll.

> 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

Wie ich das interpretiere, verweist die Microsoft.WindowsAzure.Storage-DLL auf V 5.2.0.0 der Microsoft.Data.OData-DLL. Wie behebe ich das, wenn dies das Problem ist? Laut der Dokumentation, die ich auf der Storage-DLL gesehen habe, soll sie auf 5.4 und höher verweisen, nicht auf 5.2 ...?

37
Ryk

Das Eröffnen eines Problems mit solch einer einfachen Lösung hilft Ihnen nicht.

Fügen Sie die folgende Zusatzkonfiguration in Ihre jeweiligen Konfigurationsdateien ein (web.config für die MVC und app.config für die Worker-Rolle):

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

Beachten Sie, dass der Abschnitt runtime direkt vom Wurzelelement configuration abgeleitet ist! Ich bin mir ziemlich sicher, dass Sie diesen Abschnitt bereits in Ihrer web.config haben, da MVC4 ihn verwendet, um alle Verweise auf System.Web.MVC Auf die neueste Version neu zu binden.

Ich persönlich erwarte nicht, dass das SDK mit jeder neuen Version jeder referenzierten Bibliothek aktualisiert wird! Das wäre Wahnsinn ...

40
astaykov

Ich hatte ein sehr ähnliches Problem, aber in diesem Fall war es eine Ausnahmemeldung.

Datei oder Assembly 'Microsoft.Data.OData, Version = 5.5.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35' oder eine ihrer Abhängigkeiten konnte nicht geladen werden. Die Manifestdefinition der lokalisierten Assembly stimmt nicht mit der Assemblyreferenz überein. (Ausnahme von HRESULT: 0x80131040)

beachten Sie, dass versucht wurde, Version 5.5.0.0 der OData-Assembly zu laden.

Nach einigem Stöbern mit ILSpy ( http://www.ilspy.net ) stellte ich fest, dass Microsoft.WindowsAzure.Storage 2.0.0.0 explizit auf Microsoft.Data.OData 5.2.0.0 verweist - was ich nicht getan habe habe da nicht meine version 5.5.0.0.

Die Lösung bestand also darin, Microsoft.WindowsAzure.Storage mit dem NuGet-Paketmanager zu deinstallieren. Dabei wurde Microsoft.Data.OData 5.5 deinstalliert. Installieren Sie dann erneut Microsoft.WindowsAzure.Storage mit dem NuGet-Paketmanager. Dabei wurde festgestellt, dass Microsoft.Data.OData 5.2 erforderlich ist, und auch dies wurde installiert.

und zurück zu einer funktionierenden Lösung.

16
Ben Whittle

Sie können dieses Problem im Allgemeinen lösen, wenn Sie Pakete aktualisieren oder neue Pakete über NuGet hinzufügen und Probleme mit der Meldung "Datei oder Assembly konnte nicht geladen werden ..." auftreten.

Öffnen Sie die Package Manager-Konsole ( VS 2012 Tools/Library Package Manager/Package Manager-Konsole). Sobald die Shell für die Package Manager-Konsole geöffnet ist, führen Sie den folgenden Befehl aus:

Add-BindingRedirect

Hinweis: Seien Sie vorsichtig, da das NugGet-Beispiel am Ende des Beispiels ein 's' hinzufügt und Add-BindingRedirect Kein gültiger Befehl ist.

Dies bewirkt Folgendes:

Untersucht alle Assemblys im Ausgabepfad für ein Projekt und fügt bei Bedarf Bindungsumleitungen zur Anwendungskonfigurationsdatei (app.config) oder zur Webkonfigurationsdatei (web.config) hinzu.

Die vollständige Dokumentation für die Package Manager-Konsole finden Sie unter: http://nuget.codeplex.com/wikipage?title=Package%20Manager%20Console%20Command%20Reference%20 (v1.3)

Zusätzlich zu den beiden Einträgen, die Sie in Astaykovs Antwort sehen, wurde für mein Projekt Folgendes hinzugefügt.

  <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

Ich hatte heute ein ähnliches Problem. Der einzige Unterschied, den ich festgestellt habe, ist, dass meine Cloud-App Microsoft.Data.OData in Version = 5.2.0.0 gesucht hat (und nicht gefunden hat).

Bei der Verwendung des Visual Studio-Objektbrowsers habe ich festgestellt, dass meine Lösung die Bibliothek von diesem Speicherort verwendet:

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

Die dort befindliche Microsoft.Data.OData-Bibliothek war in ver. 5.0.0.0 also überschreiben mit 5.2.0.0 das problem behoben.

P.S. Ich habe WCF Data Services Tools für Windows Store Apps früher installiert, in der Hoffnung, dieses Problem zu beheben, damit Ihre Anwendung es möglicherweise von einer anderen Quelle erhält. In diesem Fall haben Sie zwei Möglichkeiten:

  1. Installieren Sie WCF Data Services Tools für Windows Store Apps von hier und verwenden Sie die oben genannte Lösung.

  2. Verwenden Sie den Visual Studio-Objektbrowser, um zu ermitteln, welche Versionen der OData-Bibliothek derzeit für Ihr Projekt sichtbar sind und wo sie gespeichert sind. Als nächstes müssen Sie falsche Versionen davon überschreiben.

1
Szymon Drosdzol

Ich hatte auch ein ähnliches Problem, aber ich habe Azure nicht verwendet und es gab keinen fest codierten Verweis auf 5.2. Es wurde jedoch behoben (nachdem dieser Artikel ), indem sichergestellt wurde, dass der Text in der .svc-Datei auf die richtige Assembly zeigte:

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

Service = "MVC4WCFDataServiceFE5.NorthWindService"%>

Beachten Sie die Version = 5.6.0.0 , die ich vorher nicht hatte.

0
Scott Stafford