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

问题描述 投票:48回答:16

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

c# .net azure httpmodule azure-storage
16个回答
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. 使用记事本打开网站项目文件,并从所有配置属性组中删除PlatformTarget元素。此选项引自http://tomkrueger.wordpress.com/2010/07/27/azure-deployment-issue-after-upgrading-to-visual-studio-2010-and-net-4-0/
  3. 编写Post-build事件命令以在成功执行构建操作时删除msshrtmi.dll。为此,请右键单击Web角色项目,然后选择“属性”。选择Build Events选项卡,在“Post-build event命令行”文本框中输入以下命令:

cd $(TargetDir) del msshrtmi.dll

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


0
投票

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

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


0
投票

这个解决方案对我有用:

  • 用记事本打开项目
  • 删除所有“PropertyGroup”下的所有“PlatformTarget”标签

0
投票

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

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


0
投票

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


0
投票

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

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


0
投票

我遇到了同样的问题。

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


0
投票

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

脚步:

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

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应用程序都可以访问它。


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>

至:

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

部署到Azure,立即工作。

希望这可以帮助!

PS:我应该补充一点,我不需要卸载任何旧的SDK或任何东西,或者使用'Platform Targets'搞乱。只是改变这个工作正常。


3
投票

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

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


2
投票

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

现在我终于开始工作了。问题是我的机器上安装的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后,一切都运行良好。


2
投票

我通过简单地添加引用来修复我们遇到的问题

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

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


2
投票

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

这对我有用......


2
投票

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


2
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.