Не удалось загрузить файл или сборку Ошибка Microsoft.Data.OData Версия = 5.2.0.0 в роли рабочего агента Azure с использованием хранилища таблиц
У меня очень странная проблема с использованием Azure Table Storage. У меня есть проект .NET 4.5 в Visual Studio 2012, где я занимаюсь всеми функциями хранилища таблиц Azure. На этот проект /dll ссылаются два других проекта: мой веб-сайт MVC и моя роль Azure Worker. (Я работаю под эмуляторами Azure на своей машине, но это также происходит, когда я развертываю его в облаке)
У меня есть следующая функция, вызываемая при сохранении или извлечении записи:
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 у меня есть функция, которая сохранит запись в таблице хранения Azure, а затем в моей роли Azure Worker появится служба, которая будет читать запись.
Таким образом, обе используют одну и ту же DLL для хранения и извлечения, однако у моего проекта MVC нет проблем с сохранением записи, но в моей службе роли Azure Worker при попытке получить запись генерирует исключение при попытке выполнить "таблицу". CreateIfNotExists();".
Не удалось загрузить файл или сборку 'Microsoft.Data.OData, Версия = 5.2.0.0, Культура = нейтраль, PublicKeyToken = 31bf3856ad364e35 'или одной из его зависимостей. Установленное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
Я уже сделал следующее:
- Обновлены все пакеты NuGet с уровня решения до последних версий
- Я просмотрел все ссылки на проект, чтобы убедиться, что там нет старой dll или предыдущих версий, в частности System.Spatial, Microsoft.WindowsAzure.Configuration, Microsoft.WindowsAzure.ServiceRuntime и Microsoft.ServiceBus, Microsoft.WindowsAzure.Storage, Microsoft.Data.Edm и Microsoft.Data.ODatali >
- Я даже создал новый проект Cloud Service и WorkerRole с нуля, чтобы убедиться, что он не работает в текущем проекте WorkerRole.
Я не вернул dll обратно в 5.2, так как у меня было слишком много проблем в других проектах, где я использую функции, характерные для 5.3.
В настоящее время я запускаю всю dll на 5.5.
Когда я запустил утилиту 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
Как я это интерпретирую, это то, что dll Microsoft.WindowsAzure.Storage ссылается на V 5.2.0.0 dll Microsoft.Data.OData, но как я могу это исправить, если это проблема? Согласно документации, которую я видел в dll Storage, предполагается, что она должна ссылаться на 5.4 и выше, а не на 5.2...?
Любая помощь будет принята с благодарностью.
Ответы
Ответ 1
Вопрос о выпуске для такой простой проблемы не поможет вам.
Поместите следующую конфигурацию дополнений в соответствующие файлы конфигурации (web.config для MVC и 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
! Я уверен, что у вас уже есть этот раздел в вашем web.config, потому что MVC4 использует его для повторной привязки всех ссылок на System.Web.MVC
до последней версии.
Я лично не ожидаю, что SDK будет обновляться с каждой новой версией каждой справочной библиотеки! Это было бы безумием...
Ответ 2
У меня была очень похожая проблема, но в этом случае это сообщение об ошибке было:
Не удалось загрузить файл или сборку 'Microsoft.Data.OData, Версия = 5.5.0.0, Культура = нейтраль, PublicKeyToken = 31bf3856ad364e35 'или одной из его зависимостей. Установленное определение манифеста сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)
Заметьте, что он пытался загрузить v5.5.0.0 сборки OData.
После некоторых поисков с помощью 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, этот inturn удалил Microsoft.Data.OData 5.5. Затем снова с помощью диспетчера пакетов NuGet переустановите Microsoft.WindowsAzure.Storage, который определил, что ему нужен файл Microsoft.Data.OData 5.2 и он тоже установлен.
и вернуться к рабочему решению.
Ответ 3
Вы можете решить эту проблему в общем случае, когда вы обновляете пакеты или добавляете новые пакеты через NuGet, и в итоге возникают проблемы "Не могу загрузить файл или сборку...".
Откройте Консоль диспетчера пакетов (VS 2012 Tools/Library Package Manager/Консоль диспетчера пакетов). После открытия оболочки для консоли диспетчера пакетов выполните команду:
Add-BindingRedirect
Примечание. Будьте осторожны, так как пример NugGet добавил 's' в конец в своем примере и Add-BindingRedirect
не является допустимой командой.
Это делает следующее:
Изучает все сборки в пути вывода для проекта и добавляет привязка перенаправлений к файлу конфигурации приложения (app.config) или в файл конфигурации сети (web.config), где это необходимо.
Вы можете просмотреть полную документацию для консоли диспетчера пакетов по адресу: http://nuget.codeplex.com/wikipage?title=Package%20Manager%20Console%20Command%20Reference%20(v1.3)
В дополнение к двум записям, которые вы видите в ответе астайков, в мой проект также добавлено следующее.
<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>
Ответ 4
У меня была аналогичная проблема сегодня. Единственное различие, которое я обнаружил, - это облачное приложение, которое (и не удается найти) для Microsoft.Data.OData в версии = 5.2.0.0
Используя 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.
P.S. Ранее я устанавливал инструменты служб данных WCF для приложений Windows Store в надежде на решение этой проблемы, поэтому может случиться так, что ваше приложение получит его из другого источника. Если это так, у вас есть два варианта:
-
Установите инструменты службы данных WCF для приложений Windows Store из здесь и используйте вышеприведенное решение.
-
Используйте Visual Object Object Browser, чтобы узнать, какие версии библиотеки OData в настоящее время видны для вашего проекта и где они хранятся. Затем вам нужно будет перезаписать неправильные версии.
Ответ 5
У меня была аналогичная проблема, но я не использовал Azure и не было жестко закодированной ссылки, указывающей на 5.2. Но он решил (после нахождения этой статьи), убедившись, что текст в .svc указал на правильную сборку:
<%@ ServiceHost Language="C#"
Factory="System.Data.Services.DataServiceHostFactory,
Microsoft.Data.Services, Version=5.6.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Сервис = "MVC4WCFDataServiceFE5.NorthWindService" % >
Обратите внимание на Версия = 5.6.0.0, чего у меня раньше не было.