无法使用表存储在Azure Cloud Worker角色中加载文件或程序集Microsoft.Data.OData Version = 5.2.0.0错误

Ryk*_*Ryk 37 c azure azure-storage azure-table-storage

我使用Azure表存储有一个非常奇怪的问题.我在Visual Studio 2012中有一个.NET 4.5项目,我处理所有Azure表存储功能.这个项目/ dll由另外两个项目引用,我的MVC网站和我的Azure工作者角色.(我在我的机器上的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);
}
Run Code Online (Sandbox Code Playgroud)

在我的MVC网站中,我有一个将记录保存到Azure存储表的功能,然后在我的Azure工作者角色中有一个将读取记录的服务.

因此,两者都使用相同的dll进行存储和检索,但是我的MVC项目在保存记录时没有问题,但是当我尝试检索记录时,我的Azure Worker角色服务在尝试执行"table.CreateIfNotExists()时抛出异常;".

无法加载文件或程序集"Microsoft.Data.OData,Version = 5.2.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(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项目中被破坏.

我还没有将dll推回到5.2,因为我在其他项目中遇到太多问题,我使用的功能从5.3开始具体.

我目前正在5.5上运行所有的dll.

当我运行此处找到的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
Run Code Online (Sandbox Code Playgroud)

我是如何理解的,是Microsoft.WindowsAzure.Storage dll引用了Microsoft.Data.OData dll的V 5.2.0.0,但如果这是问题,我该如何解决?根据我在Storage dll上看到的文档,它应该引用5.4及以上,而不是5.2 ......?

ast*_*kov 40

这样一个容易解决的问题的开放问题对你没有帮助.

将以下添加配置放在相应的配置文件中(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>
Run Code Online (Sandbox Code Playgroud)

请注意,该runtime部分是configuration根元素的直接后代!我很确定你的web.config中已经有了这个部分,因为MVC4用它来重新绑定所有对System.Web.MVC最新版本的引用.

我个人不希望每个引用的库的每个新版本都更新SDK!这将是疯狂的......

  • 谢谢,修好了,但我不同意你的看法.微软正在改变他们使用NuGet和定期更新将内容从12/18个月更新/部署到快速升级/部署的方式.这使得dll版本的管理比过去每年更改一次更加重要,现在它们每周都会在这些Azure软件包上更改一次.因此,为了帮助我们不打败dll版本的地狱,他们至少应该创建NuGet包来自动更新配置文件.现在我知道这很简单,但我花了两天时间来到这里.谢谢! (12认同)
  • 我也不同意这是"容易解决",但感谢答案,因为它也节省了我一点时间. (6认同)
  • 虽然我不是要同意或不同意之前的任何评论,但在尝试了所有建议的选项后,我仍然会收到初始错误消息.我指的是Microsoft.Data.Edm版本5.0.2.0; Microsoft.Data.OData版本5.0.2.0和System.Spatial版本5.0.2.0; 在使用NuGet卸载并重新安装几个东西后,错误仍然存​​在,显然不管我使用的任何其他版本的引用文件.所以最后我仍然坚持这个问题,并寻找一个解决方案而不是可行的工作,但这简直就是工作!那要问多少? (3认同)
  • @astaykov - 看看这个问题自上​​次以来被观看过的次数以及收到的评论,我认为可以公平地说,你们这里有一个潜在的"荆棘"需要被关注.这令人沮丧,并在整个社区引起很多挫折.我不在乎装配绑定已经存在了很长时间.简单的事实是,现在有了NuGet时代,需要再次查看并修复. (2认同)

小智 15

我有一个非常相似的问题,但在这种情况下它的异常消息是;

无法加载文件或程序集"Microsoft.Data.OData,Version = 5.5.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35"或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

请注意它正在尝试加载OD5程序集的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,这个inturn卸载了Microsoft.Data.OData 5.5.然后再次使用NuGet包管理器,重新安装Microsoft.WindowsAzure.Storage,它确定它需要Microsoft.Data.OData 5.2并安装它.

并回到工作解决方案.


ees*_*esh 10

每当您通过NuGet更新软件包或添加新软件包并最终出现"无法加载文件或程序集..."问题时,您通常可以解决此问题.

打开包管理器控制台(VS 2012工具/库包管理器/包管理器控制台).打开包管理器控制台的shell后,运行以下命令:

附加BindingRedirect

注意:请注意,因为NugGet示例在其示例中的末尾添加了"s",并且Add-BindingRedirect不是有效命令.

这样做如下:

检查项目输出路径中的所有程序集,并将绑定重定向添加到应用程序配置(app.config)文件或Web控件(web.config)文件中.

您可以在以下位置查看Package Manager控制台的完整文档:http://nuget.codeplex.com/wikipage?title = Printer%20Manager%20Console%20Command%20Reference%20(v1.3)

除了你在astaykov的答案中看到的两个条目之外,还为我的项目添加了以下内容.

  <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>
Run Code Online (Sandbox Code Playgroud)