无法加载文件或程序集“msshrtmi”或其依赖项之一(Azure表存储访问)

时间:2011-11-25 19:10:10

标签: c# .net azure httpmodule azure-storage

我有一个HTTPModule,用于在我的数据中心的网站和Azure平台上运行的网站之间重定向流量。此HTTPModule从Azure表存储中检索其重定向规则。

重定向在我的本地开发计算机上以及在Azure上运行时正常工作。但是,当我将模块部署到我的数据中心服务器(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无法从表存储加载其配置数据,而是抛出以下错误

---> 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”作为部署的一部分,以确保它在数据中心服务器上可用。

15 个答案:

答案 0 :(得分:30)

Azure项目似乎对该特定​​文件非常敏感。来自:http://social.msdn.microsoft.com/Forums/en-US/windowsazuretroubleshooting/thread/0fac1f05-eb55-432f-80ac-6f15cde5b14b/

  

当您为Web角色项目进行重建时,我可以要求您进行检查   如果bin文件夹中有msshrtmi.dll文件?如果是,那么请   使用Dependency Walker检查它是64位还是32位。如果是32位,   请尝试以下任一选项以防止输出此信息   dll文件到bin文件夹。

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

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

  4.   
  5. 编写Post-build事件命令以在成功执行构建操作时删除msshrtmi.dll。为此,请右键单击   Web角色项目并选择“属性”。选择Build Events选项卡,   在“构建后事件命令行”文本框中,输入以下内容   命令:

  6.         

    cd $(TargetDir)   del msshrtmi.dll

这一切都表明您需要检查是否已在目标环境中构建了正确的部署配置。确保您已将x64作为目标部署到数据中心服务器。

答案 1 :(得分:19)

这解决了我的问题。在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"

这将在全局程序集缓存中注册运行时文件,以便所有.NET应用程序都可以访问它。

答案 2 :(得分:18)

我刚刚遇到过这篇文章,因为我遇到了同样的问题 - 不幸的是上述步骤都不适用于我

经过一番搔痒和捣乱之后 - 我找到了解决方案,这非常简单/令人尴尬。

我在博客上发表了here

  • 右键单击Azure项目(带有蓝色地球的项目)。
  • 单击“应用程序”选项卡。
  • 请注意,有一个按钮告诉您安装了较新的SDK? 点击它!

因此,事实证明,对一些文件进行了一些细微的更改,这些文件会产生重大影响:

  • .csdef文件 - “schemaVersion”已更新。
  • .ccproj - “ProductVersion”和“CloudExtensionsDir”已更新。
  • .csproj - 您将更新Azure SDK引用(ServiceRuntime,Diagnostics等)

我认为对我来说杀手是'CloudExtensionsDir',这改变了来自:

<CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">
  $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Windows Azure Tools\1.7\
</CloudExtensionsDir>

TO:

<CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">
  $(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Windows Azure Tools\1.8\
</CloudExtensionsDir>

部署到Azure,直接工作。

希望这有帮助!

PS:我应该补充一点,我不需要卸载任何旧的SDK或任何东西,或者使用'平台目标'。只是改变它就可以了。

答案 3 :(得分:3)

我在处理这个问题很长一段时间后遇到了这个问题。它帮助了我。

http://mictorino.wordpress.com/2011/09/20/vs2010-build-configurations-and-msshrtmi-dll-x86

答案 4 :(得分:2)

这个问题在过去的两天里一直困扰着我,这里和其他网站上提到的所有解决方案都不起作用。

现在我终于开始工作了。问题是我的机器上安装的SDK和工具版本的一些不好的组合。几天前我下载了以下内容:

  • Windows Azure Tools 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之后,一切都运行良好。

答案 5 :(得分:2)

我通过简单地添加对

的引用来解决我们遇到的问题

C:\ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ 2012-06 \ bin \ runtimes \ base \ x86 \ msshrtmi.dll

它可能不适用于所有场景,但值得一试。

答案 6 :(得分:2)

只需在您的项目中添加“ _bin_deployableAssemblies ”文件夹即可。将文件“ C:\ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ 2012-06 \ bin \ runtimes \ base \ x64 \ msshrtmi.dll ”放在此文件夹中。将构建操作更改为“”,然后部署...

这对我有用......

答案 7 :(得分:2)

我可能很疯狂,但这件事发生在我身上,因为Windows Azure SDK 甚至没有安装。我知道,这很愚蠢,但在某些情况下要注意这一点。

答案 8 :(得分:2)

我最近经历过这一点并确定,至少在我的情况下,这个错误是由于引用了比当前SDK版本旧的Microsoft.WindowsAzure.ServiceRuntime引起的。

在我的实例中,我刚刚升级到SDK 2.2,但我的ServiceRuntime引用仍然是2.1,更新这些引用2.2解决了问题,而我不必引用msshrtmi.dll。

答案 9 :(得分:0)

使用可部署到Windows Azure和物理硬件的解决方案时,我遇到了类似错误。尝试在物理硬件上运行解决方案时会出现错误。问题源于Azure库是解决方案的一部分,即使它们不是内部构建所必需的。

简单的解决方案是在物理硬件上安装Windows Azure SDK。这会将缺少的库安装到GAC中

答案 10 :(得分:0)

此解决方案适用于我:

  • 使用记事本打开项目
  • 删除所有“PropertyGroup”
  • 下的所有“PlatformTarget”代码

答案 11 :(得分:0)

我解决这个问题的方法是使用我的应用程序发送msshrtmi.dll(x86和x64),然后在需要时动态加载它们。

请参阅http://jake.ginnivan.net/azure-and-msshrtmi

答案 12 :(得分:0)

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

[1] c:\ Windows \ assembly \ GAC_64 \ msshrtmi \ 1.7.0.0__31bf3856ad364e35&gt;

答案 13 :(得分:0)

我遇到了同样的问题。

从您的解决方案文件夹/子文件夹中删除所有文件“msshrtmi.dll”然后重建。

答案 14 :(得分:0)

我将“ 复制本地”属性更改为“ 错误”。它对我有用。

步骤:

  1. 转到参考。
  2. 从参考中打开dll的属性。
  3. 将“ 复制本地”属性更改为错误