无法加载文件或程序集“msshrtmi”或其某个依赖项(Azure表存储访问)
我有一个HTTPModule,用于在我的数据中心网站和运行在Azure平台上的网站之间redirectstream量。 此HTTPModule从Azure表存储中检索其redirect规则。
在本地开发机器上以及在Azure上运行时,redirect都能正常工作。 但是,当我将模块部署到我的数据中心服务器(IIS 7,WS 2008 R2标准64位,.NET 4.0,ASP.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无法从表存储加载其configuration数据,而是引发以下错误
---> 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.ServiceRuntime.dll”作为部署的一部分,以确保它在数据中心服务器上可用。
Azure项目似乎对这个特定的文件非常敏感。 从: http : //social.msdn.microsoft.com/Forums/en-US/windowsazuretroubleshooting/thread/0fac1f05-eb55-432f-80ac-6f15cde5b14b/
当您为Webangular色项目重build时,我可能会要求您检查bin文件夹中的msshrtmi.dll文件吗? 如果是的话,请使用Dependency Walker检查是64位还是32位。 如果是32位,请尝试以下任一选项以防止将此dll文件输出到bin文件夹。
将webangular色项目定位到x64并重新创buildazure服务项目。 此选项已被
http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/286cecf6-1423-4ef3-93f9-0eb8a67d8192确认。 (编辑:现在是截至二月十二日的死链接)使用记事本打开网站项目文件,并从所有configuration属性组中删除PlatformTarget元素。 这个选项是从http://tomkrueger.wordpress.com/2010/07/27/azure-deployment-issue-after-upgrading-to-visual-studio-2010-and-net-4-0/引用的。;
编写生成后事件命令以在生成操作成功执行时删除msshrtmi.dll。 为此,请右键单击Webangular色项目,然后select“属性”。 select“生成事件”选项卡,在“生成后事件命令行”文本框中input以下命令:
cd $(TargetDir)
del msshrtmi.dll
这一切都表明您将要检查您是否已经构build了适用于目标环境的正确configuration。 确保您已将目标x64部署到您的数据中心服务器。
我刚刚遇到这个post,因为我有同样的问题 – 不幸的是没有上述步骤为我工作 。
经过一些头部划伤和混乱 – 我发现解决scheme,这是显着/令人尴尬的简单。
我在这里博客了。
- 右键单击您的Azure项目(具有蓝色地球的项目)。
- 点击“应用程序”选项卡。
- 请注意有一个button告诉你,你有一个新的SDK安装? 点击它!
所以,事实certificate,一些小小的变化,使一些文件,使所有的差异:
-
schemaVersion
文件 – “schemaVersion
”已更新。 - .ccproj – “
ProductVersion
”和“CloudExtensionsDir
”已更新。 - .csproj – 你是Azure SDK引用将被更新(ServiceRuntime,诊断等)
我认为杀手是我的“ 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或任何东西,或与“平台目标”混乱。 只是改变这个工作正常。
这解决了我的问题。 在VS2013的Developer Command Prompt中运行此命令。
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"
这会将运行时文件注册到全局程序集caching中,这样所有的.NET应用程序都可以访问它。
在处理这个问题很长时间之后,我碰到了这个问题。 它帮助了我。
http://mictorino.wordpress.com/2011/09/20/vs2010-build-configurations-and-msshrtmi-dll-x86
这个问题在过去的两天里给我带来了麻烦,而且这里和其他网站上提到的所有解决scheme都不起作用。
现在我终于搞定了。 问题是在我的机器上安装了SDK和工具版本的一些不好的组合。 前几天我下载了以下内容:
- Windows Azure工具1.7
- Visual Studio 2012的Windows Azure SDK预览(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.NET SDK \ 2012-06 \ bin \ runtimes \ base \ x86 \ msshrtmi.dll
它可能不适用于所有情况,但值得一试。
只需在您的projet中添加“ _bin_deployableAssemblies ”文件夹即可。 将该文件夹中的“ C:\ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ 2012-06 \ bin \ runtimes \ base \ x64 \ msshrtmi.dll ”。 将生成操作更改为“ 无 ”,只需部署…
这对我来说是…
我最近经历了这一点,并确定,至less在我的情况下,这个错误是由于引用Microsoft.WindowsAzure.ServiceRuntime,比当前的SDK版本旧。
在我刚刚升级到SDK 2.2的实例中,但是我的ServiceRuntime引用仍然是2.1,将这些引用更新为2.2解决了这个问题,而不需要引用msshrtmi.dll。
我可能是疯了,但这发生在我身上,因为Windows Azure SDK甚至没有安装 。 愚蠢的,我知道,但在某些情况下有用的保持眼睛。
使用可部署到Windows Azure和物理硬件的解决scheme时,我遇到了类似的错误。 尝试在物理硬件上运行解决scheme时,会显示错误。 问题源于Azure库是解决scheme的一部分,即使它们不是内部部署版本所必需的。
简单的解决scheme是在物理硬件上安装Windows Azure SDK。 这会将缺less的库安装到GAC中
这个解决scheme适用于我:
- 用记事本打开项目
- 删除所有“PropertyGroup”下的所有“PlatformTarget”标签
我对这个问题的解决scheme是运送msshrtmi.dll(包括x86和x64)与我的应用程序,然后在需要时dynamic加载它们。
我已经通过向GAC添加msshrtmi来解决问题。
通过确保我引用GAC [1]
的msshrtmi.dll
的X64版本(以匹配项目中设置的x64的平台目标),我能够解决此问题。
[1]
c:\ Windows \ assembly \ GAC_64 \ msshrtmi \ 1.7.0.0__31bf3856ad364e35>
我遇到了同样的问题。
从您的解决scheme文件夹/子文件夹删除所有文件“msshrtmi.dll”,然后重build。