无法加载文件或程序集'msshrtmi'或其依赖项之一(Azure表存储访问)
本文关键字:Azure 访问 存储 文件 加载 程序集 msshrtmi 依赖 | 更新日期: 2023-09-27 18:15:39
我有一个HTTPModule,我用它来重定向数据中心网站和Azure平台上运行的网站之间的流量。这个HTTPModule从Azure表存储中检索它的重定向规则。
重定向在我的本地开发机器上以及在Azure上运行时都可以正常工作。然而,当我将该模块部署到我的数据中心服务器(IIS 7、WS 2008 R2标准64位、。net 4.0、ASP. net等)时。. NET 4.0)我收到以下错误
Parser Error Message: Could not load file or assembly 'msshrtmi' or one of its dependencies. An attempt was made to load a program with an incorrect format.
Line 124: <add assembly="System.Web.DynamicData, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
Line 125: <add assembly="System.Web.ApplicationServices, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
Line 126: <add assembly="*" />
Line 127: </assemblies>
Line 128: <buildProviders>
Source File: C:'Windows'Microsoft.NET'Framework'v4.0.30319'Config'web.config Line: 126
"msshrtmi.dll"实际存在于我的部署bin目录中。
如果我删除这个dll,数据中心网站工作正常,但HTTPModule未能从表存储中加载其配置数据,而是抛出以下错误
---> System.TypeInitializationException: The type initializer for 'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' threw an exception. ---> System.IO.FileNotFoundException: Could not load file or assembly 'msshrtmi, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeEnvironment()
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment..cctor()
--- End of inner exception stack trace ---
at Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.get_IsAvailable()
另外,我已经手动包含了"microsoft . windowsazure . servicertime .dll"作为部署的一部分,以确保它在数据中心服务器上可用。
似乎Azure项目对特定的文件非常敏感。来自:http://social.msdn.microsoft.com/forums/en - us/windowsazuretroubleshooting/thread/0fac1f05 eb55 - 432 f - 80 ac - 6 - f15cde5b14b/
当您为web角色项目进行重建时,我可以要求您检查如果在bin文件夹中有msshrtmi.dll文件?如果是,那么请使用Dependency Walker检查它是64位还是32位。如果是32位,请尝试以下选项之一以防止输出此内容DLL文件到bin文件夹
将web角色项目定位到x64并重新创建azure服务项目。此选项由<罢工> http://social.msdn.microsoft.com/forums/en/windowsazure/thread/286cecf6 - 1423 - 4 - ef3 - 93 - f9 - 0 - eb8a67d8192> 罢工>
使用记事本打开网站项目文件,并从所有配置属性组中删除PlatformTarget元素。这期权引用自http://tomkrueger.wordpress.com/2010/07/27/azure部署-问题- -升级后视觉工作室- 2010和-网- 4 - 0/。
写Post-build event命令,当一个build动作成功执行时,删除msshrtmi.dll。要做到这一点,请右键单击web角色项目,并选择"属性"。选择Build Events选项卡,在"Post-build事件命令行"文本框中输入如下内容命令:
cd $(TargetDir)
del msshrtmi.dll
这些都表明您需要检查是否为在目标环境上的部署构建了正确的配置。确保将x64作为部署到数据中心服务器的目标。
这就为我解决了这个问题。在VS2013的开发人员命令提示符中运行此命令。
gacutil /i "C:'Program Files'Microsoft SDKs'Windows Azure'.NET SDK'v2.0'bin'runtimes'base'x64'msshrtmi.dll"
gacutil /i "C:'Program Files'Microsoft SDKs'Windows Azure'.NET SDK'v2.0'bin'runtimes'base'x86'msshrtmi.dll"
这将在全局程序集缓存中注册运行时文件,以便所有。net应用程序都可以访问它。
我刚刚看到这篇文章,因为我有同样的问题-不幸的是以上步骤对我都不起作用
经过一番挠头和折腾之后,我找到了解决方案,它非常简单。
我在这里写了一篇博文。
- 右键单击你的Azure项目(蓝色地球仪的那个)。
- 点击"应用程序"选项卡。
- 请注意,有一个按钮告诉你,你有一个较新的SDK安装?点击它!
所以,事实证明,对几个文件做了一些小的改变,就会产生很大的不同:
-
。csdef file - '
schemaVersion
'已更新 -
。ccproj - '
ProductVersion
'和'CloudExtensionsDir
'更新。 - 。csproj -你的Azure SDK引用将被更新(ServiceRuntime, Diagnostics等)
我认为凶手是' CloudExtensionsDir
'对我来说,这改变了:
<CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">
$(MSBuildExtensionsPath)'Microsoft'VisualStudio'v$(VisualStudioVersion)'Windows Azure Tools'1.7'
</CloudExtensionsDir>
:
<CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">
$(MSBuildExtensionsPath)'Microsoft'VisualStudio'v$(VisualStudioVersion)'Windows Azure Tools'1.8'
</CloudExtensionsDir>
部署到Azure,立即工作。
希望这对你有帮助!
PS:我应该补充一下,我不需要卸载任何旧的SDK或任何东西,也不需要与"平台目标"混淆。只要改变这个就可以了。
我在处理这个问题很长一段时间后遇到了这个问题。它帮助了我。
http://mictorino.wordpress.com/2011/09/20/vs2010-build-configurations-and-msshrtmi-dll-x86这个问题已经困扰了我两天了,这里和其他网站上提到的所有解决方案都不起作用。
现在我终于让它工作了。问题是我的机器上安装的一些sdk和工具版本的错误组合。几天前我下载了以下文件:
- Windows Azure Tools 1.7Windows Azure SDK for Visual Studio 2012预览版(2012年6月)
我知道Azure SDK是一个预览版,但是一些发布说明让我相信它包含了Visual Studio 2010的当前版本(稳定)SDK。
在我卸载预览并安装Windows Azure SDK for .NET (VS 2010 SP1) - June 2012
之后,一切都工作得很好。
我通过简单地添加一个引用来修复我们所遇到的问题
C:'Program Files'Microsoft sdk 'Windows Azure。净SDK ' 2012 - 06年' bin ' runtimes '基地' x86 ' msshrtmi.dll
它可能不适用于所有场景,但值得一试。
只需在项目中添加"_bin_deployableAssemblies"文件夹。把文件"C:'Program Files'Microsoft sdk 'Windows Azure"。. NET SDK'2012-06'bin'runtimes'base'x64'msshrtmi.dll"将Build Action更改为"None",然后只需部署…
这是我的工作…
我可能是疯了,但这发生在我身上,因为Windows Azure SDK 甚至没有安装。我知道这很蠢,但在某些情况下很有用。
我最近遇到了这个问题,并确定,至少在我的情况下,这个错误是由对Microsoft.WindowsAzure.ServiceRuntime的引用比当前SDK版本早引起的。
在我的实例中,我刚刚升级到SDK 2.2,但我的ServiceRuntime引用仍然是2.1,更新这些引用到2.2解决了这个问题,而我不必引用msshrtmi.dll。
我改变了"复制本地"属性"假"。这对我来说很有效。
步骤:
- 转到参考
- 从引用打开dll的属性。
- 更改"Copy Local"属性为False。
我在使用可部署到Windows Azure和物理硬件的解决方案时遇到了类似的错误。当尝试在物理硬件上运行解决方案时,会出现错误。问题的根源在于Azure库是解决方案的一部分,尽管它们不是内部部署构建所必需的。
简单的解决方案是在物理硬件上安装Windows Azure SDK。这将安装缺失的库到GAC
这个解决方案为我工作:
- 用记事本打开项目
- 删除所有"PropertyGroup"下的所有"PlatformTarget"标签
我的解决方案是将msshrtmi.dll (x86和x64)与我的应用程序一起发布,然后在需要时动态加载它们。
见http://jake.ginnivan.net/azure-and-msshrtmi
我已经通过添加msshrtmi到GAC解决了这个问题。
我能够通过确保我在GAC [1]
中引用msshrtmi.dll
的X64版本来解决这个问题(以匹配项目中设置的X64平台目标)。
[1]
c:'Windows'assembly'GAC_64'msshrtmi' 1.7.00 ' __31bf3856ad364e35>
我遇到了同样的问题。
从您的解决方案文件夹/子文件夹中删除所有文件"msshrtmi.dll"然后重建。