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

Posted

技术标签:

【中文标题】无法加载文件或程序集“msshrtmi”或其依赖项之一(Azure 表存储访问)【英文标题】:Could not load file or assembly 'msshrtmi' or one of its dependencies (Azure Table Storage Access) 【发布时间】:2012-01-06 13:59:05 【问题描述】:

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

重定向在我的本地开发机器上以及在 Azure 上运行时都可以正常工作。但是,当我将模块部署到我的数据中心服务器(IIS 7、WS 2008 R2 Standard 64bit、.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”作为部署的一部分包含在内,以确保它在数据中心服务器上可用。

【问题讨论】:

【参考方案1】:

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文件夹。

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

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

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

cd $(TargetDir) del msshrtmi.dll

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

【讨论】:

(感谢@KronoS 对选项 1 中的死链接的说明。据我所知,建议仍然很好,请注意。)【参考方案2】:

这解决了我的问题。在 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 应用程序都可以访问它。

【讨论】:

这是给我的(将 v2.0 更改为 v2.2)。我猜当我安装 Azure SDK 2.2 时,它没有将该文件注册到 GAC。 这非常有用。在破坏了我的头几个小时并最终求助于 *** 搜索后节省了几个小时 这个解决方案也适用于 VS2012/13 和 Azure SDK 2.2。我花了太多时间试图弄清楚这一点。 这也适用于 Azure SDK 2.3 和 2.7 的 SxS 安装(针对每个版本的项目不同)。 不适合我...【参考方案3】:

我刚刚看到这篇文章,因为我遇到了同样的问题 - 不幸的是以上步骤都对我不起作用

经过一番摸索和折腾后,我找到了解决方案,它非常/令人尴尬地简单。

我在博客上写了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 或任何东西,也不需要弄乱“平台目标”。只需更改此设置即可。

【讨论】:

请注意,在您右键单击您的项目检查更新之前下载最新的 SDK!谢谢罗布。 +1 谢谢,帮了大忙!【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

现在我终于让它工作了。问题是我的机器上安装的 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 后,一切正常。

【讨论】:

【参考方案6】:

我通过简单地添加对

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

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

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

【讨论】:

嘿嘿。最近有同样的问题..谷歌搜索并找到了这个..忘记了我以前发布过..干得好!解决了我的问题.. 在严重浪费时间卸载/重新安装与 Azure 有关的所有内容之后,这最终也为我解决了这个问题。谢谢【参考方案7】:

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

这对我有用...

【讨论】:

【参考方案8】:

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

【讨论】:

【参考方案9】:

我最近遇到了这种情况,并确定至少在我的情况下,此错误是由对 Microsoft.WindowsAzure.ServiceRuntime 的引用引起的,该引用比当前 SDK 版本旧。

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

【讨论】:

【参考方案10】:

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

步骤:

    转到参考。 从引用中打开 dll 的属性。 将“Copy Local”属性更改为False

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

这个解决方案对我有用:

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

【讨论】:

【参考方案13】:

我对这个问题的解决方案是将 msshrtmi.dll(x86 和 x64)与我的应用一起提供,然后在需要时动态加载它们。

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

【讨论】:

请将您博客中的答案复制并粘贴到此处。如果您的博客链接移动或失效,则此答案将毫无用处。【参考方案14】:

我通过将 msshrtmi 添加到 GAC 解决了问题。

【讨论】:

【参考方案15】:

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

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

【讨论】:

【参考方案16】:

我遇到了同样的问题。

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

【讨论】:

以上是关于无法加载文件或程序集“msshrtmi”或其依赖项之一(Azure 表存储访问)的主要内容,如果未能解决你的问题,请参考以下文章

无法加载文件或程序集 此处的程序集名称 或其依赖项之一。访问被拒绝

无法加载文件或程序集“CefSharp.dll”或其依赖项之一

无法加载文件或程序集“***.dll”或其依赖项之一

BadImageFormatException 无法加载文件或程序集或其依赖项之一。试图加载格式不正确的程序

无法加载文件或程序集“Oracle.ManagedDataAccessDTC.DLL”或其依赖项之一

无法加载文件或程序集“Elmah”或其依赖项之一。该系统找不到指定的文件