无法加载文件或程序集“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文件夹。

  1. 将webangular色项目定位到x64并重新创buildazure服务项目。 此选项已被http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/286cecf6-1423-4ef3-93f9-0eb8a67d8192确认。 (编辑:现在是截至二月十二日的死链接)

  2. 使用记事本打开网站项目文件,并从所有configuration属性组中删除PlatformTarget元素。 这个选项是从http://tomkrueger.wordpress.com/2010/07/27/azure-deployment-issue-after-upgrading-to-visual-studio-2010-and-net-4-0/引用的。;

  3. 编写生成后事件命令以在生成操作成功执行时删除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加载它们。

http://jake.ginnivan.net/azure-and-msshrtmi

我已经通过向GAC添加msshrtmi来解决问题。

通过确保我引用GAC [1]msshrtmi.dll的X64版本(以匹配项目中设置的x64的平台目标),我能够解决此问题。

[1] c:\ Windows \ assembly \ GAC_64 \ msshrtmi \ 1.7.0.0__31bf3856ad364e35>

我遇到了同样的问题。

从您的解决scheme文件夹/子文件夹删除所有文件“msshrtmi.dll”,然后重build。