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)
我已经做了以下事情:
我还没有将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!这将是疯狂的......
小智 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)
| 归档时间: |
|
| 查看次数: |
58251 次 |
| 最近记录: |