我使用Azure表存储有一个非常特殊的问题。我在Visual Studio 2012中有一个.NET 4.5项目,我处理所有Azure表存储功能。这个项目/ dll由另外两个项目引用,我的MVC网站和我的Azure工作者角色。 (我在我的机器上的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工作者角色中有一个将读取记录的服务。
因此,两者都使用相同的dll进行存储和检索,但是我的MVC项目在保存记录时没有问题,但是当我尝试检索记录时,我的Azure Worker角色服务在尝试执行“table”时抛出异常。 CreateIfNotExists();”
无法加载文件或程序集'Microsoft.Data.OData, Version = 5.2.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或 其中一个依赖项。定位程序集的清单定义 与装配参考不匹配。 (HRESULT的例外情况: 0x80131040)
我已经完成了以下工作:
我还没有把dll推回到5.2,因为我在其他项目中遇到太多问题,我使用的功能从5.3起开始。
我目前正在5.5上运行所有dll。
当我运行找到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.4及以上,而不是5.2 ......?
答案 0 :(得分:38)
这样一个容易解决的问题的开放问题对你没有帮助。
将以下添加配置放在相应的配置文件中(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
根元素的直接后代!我很确定你的web.config中已经有了这个部分,因为MVC4使用它将所有对System.Web.MVC
的引用重新绑定到最新版本。
我个人不希望每个引用的库的每个新版本都更新SDK!这将是疯狂的......
答案 1 :(得分:16)
我有一个非常类似的问题,但在这种情况下,异常消息是;
无法加载文件或程序集'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,这个已经卸载的Microsoft.Data.OData 5.5。然后再次使用NuGet包管理器,重新安装Microsoft.WindowsAzure.Storage,它确定它需要Microsoft.Data.OData 5.2并安装它。
并回到工作解决方案。
答案 2 :(得分:10)
每当您通过NuGet更新软件包或添加新软件包并最终导致“无法加载文件或程序集...”问题时,您通常可以解决此问题。
打开程序包管理器控制台( VS 2012工具/库程序包管理器/程序包管理器控制台)。打开包管理器控制台的shell后,运行命令:
添加-BindingRedirect 强>
注意:请注意,因为NugGet示例在示例中的末尾添加了's',Add-BindingRedirect
不是有效命令。
执行以下操作:
检查项目输出路径中的所有程序集并添加 绑定重定向到应用程序配置(app.config)文件 或者需要的Web配置(web.config)文件。
您可以在以下位置查看软件包管理器控制台的完整文档:http://nuget.codeplex.com/wikipage?title=Package%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>
答案 3 :(得分:1)
我今天遇到过类似的问题。我发现的唯一区别是我的云应用程序在版本= 5.2.0.0
中查找(并且未能找到)Microsoft.Data.OData使用Visual Studio对象浏览器我发现我的解决方案使用了该位置的库:
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。我之前为Windows Store应用程序安装了WCF数据服务工具,希望能够解决此问题,因此您的应用程序可能会从其他来源获取它。如果是这种情况,您有两种选择:
从here安装适用于Windows应用商店应用的WCF数据服务工具并使用上述解决方案。
使用Visual Studio对象浏览器查找项目当前可见的OData库版本及其存储位置。接下来,您需要覆盖它们的不正确版本。
答案 4 :(得分:0)
我也有类似的问题,但我没有使用Azure,也没有指向5.2的硬编码引用。但它通过确保.svc中的文本指向正确的程序集来解决(在找到this article之后):
<%@ ServiceHost Language="C#"
Factory="System.Data.Services.DataServiceHostFactory,
Microsoft.Data.Services, Version=5.6.0.0,
Culture=neutral, PublicKeyToken=31bf3856ad364e35"
Service =“MVC4WCFDataServiceFE5.NorthWindService”%&gt;
请注意版本= 5.6.0.0 ,这是我之前没有的。