无法加载文件或程序集“msshrtmi”或其依赖项之一(Azure 表存储访问)
我有一个 HTTPModule,用于在数据中心的网站和 Azure 平台上运行的网站之间重定向流量。此 HTTPModule 从 Azure 表存储检索其重定向规则。
重定向在我的本地开发计算机以及在 Azure 上运行时都可以正常工作。但是,当我将该模块部署到我的数据中心服务器(IIS 7、WS 2008 R2 Standard 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”包含在部署中以确保它在数据中心服务器上可用。
I have an HTTPModule that I use to redirect traffic between a website in my data center and a website running on the Azure platform. This HTTPModule retrieves its redirect rules from Azure Table Storage.
Redirects work fine on my local dev machine as well as when running on Azure. However, when I deploy the module to my data center servers ( IIS 7, WS 2008 R2 Standard 64bit, .NET 4.0, ASP.NET 4.0 ) I receive the following error
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" actually exists in my deployment bin directory.
If I remove this dll the data center site works fine but but the HTTPModule fails to load its configuration data from Table Storage and instead throws the following error
---> 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()
Also, I have manually included "Microsoft.WindowsAzure.ServiceRuntime.dll" as part of the deployment to ensure it is available on the data center servers.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(16)
只需在项目中添加“_bin_deployableAssemblies”文件夹即可。将文件“C:\Program Files\Microsoft SDKs\Windows Azure.NET SDK\2012-06\bin\runtimes\base\x64\msshrtmi.dll”放入此文件夹中。将构建操作更改为“无”并部署...
这对我有用...
Just add the "_bin_deployableAssemblies" folder in your projet. Put the file "C:\Program Files\Microsoft SDKs\Windows Azure.NET SDK\2012-06\bin\runtimes\base\x64\msshrtmi.dll" in this folder. Change the Build Action to "None" and just deploy...
It's work for me...
我可能疯了,但这件事发生在我身上,因为 Windows Azure SDK根本就没有安装。我知道这很愚蠢,但在某些情况下保持警惕很有用。
I may be crazy, but this happened to me because the Windows Azure SDK WAS NOT EVEN INSTALLED. Stupid, I know, but useful to keep an eye for in certain situations.
我最近经历过这种情况,并确定,至少就我而言,此错误是由于引用了比当前 SDK 版本更旧的 Microsoft.WindowsAzure.ServiceRuntime 引起的。
在我的实例中,我刚刚升级到 SDK 2.2,但我的 ServiceRuntime 引用仍然是 2.1,将这些引用更新到 2.2 解决了问题,而无需引用 msshrtmi.dll。
I experienced this recently and determined that, in my case at least, this error was caused by having a reference to Microsoft.WindowsAzure.ServiceRuntime that was older than the current SDK version.
In my instance I had just upgraded to SDK 2.2 but my ServiceRuntime references were still 2.1, updating these references to 2.2 solved the problem without me having to reference msshrtmi.dll.
我将“复制本地”属性更改为“False”。这对我有用。
步骤:
I changed the "Copy Local" property to "False". And it worked for me.
Steps:
在使用可部署到 Windows Azure 和物理硬件的解决方案时,我遇到了类似的错误。尝试在物理硬件上运行该解决方案时会出现该错误。问题源于这样一个事实:Azure 库是解决方案的一部分,尽管本地构建不需要它们。
简单的解决方案是在物理硬件上安装 Windows Azure SDK。这会将缺少的库安装到 GAC 中
I suffered from a simlar error when working with a solution that was deployable to both Windows Azure and physical hardware. The error would show up when attempting to run the solution on physical hardware. The problem stemmed from the fact that Azure libraries were part of the solution, even though they were'nt required for the on-premise build.
The simple solution is to install the Windows Azure SDK on the physical hardware. This will install the missing libraries into the GAC
这个解决方案对我有用:
This solution work for me:
我对此问题的解决方案是将 msshrtmi.dll(x86 和 x64)与我的应用程序一起提供,然后在需要时动态加载它们。
请参阅http://jake.ginnivan.net/azure-and-msshrtmi
My solution to this problem was to ship msshrtmi.dll (both x86 and x64) with my app, then dynamically load them when needed.
See http://jake.ginnivan.net/azure-and-msshrtmi
我通过将 msshrtmi 添加到 GAC 解决了问题。
I've solved issue by adding msshrtmi to GAC.
通过确保我在 GAC
[1]
中引用msshrtmi.dll
的 X64 版本(以匹配 x64 的平台目标),我能够解决此问题在项目上设置)。[1]
c:\Windows\Assembly\GAC_64\msshrtmi\1.7.0.0__31bf3856ad364e35>I was able to get around this problem by making sure that I was referencing the X64 version of
msshrtmi.dll
in the GAC[1]
(to match the platform target of x64 set on the project).[1]
c:\Windows\assembly\GAC_64\msshrtmi\1.7.0.0__31bf3856ad364e35>我也遇到了同样的问题。
从您的解决方案文件夹/子文件夹中删除所有文件“msshrtmi.dll”,然后重建。
I was having the same problem.
From your solution folder/subfolders delete all files "msshrtmi.dll" then rebuild.
Azure 项目似乎对该特定文件非常敏感。来自:http://social.msdn.microsoft.com/Forums/en-US/windowsazuretroubleshooting/thread/0fac1f05-eb55-432f-80ac-6f15cde5b14b/
这一切都表明您需要检查是否已为目标环境上的部署构建了正确的配置。确保您已将 x64 定位为部署到数据中心服务器的目标。
It seems that Azure projects are very sensitive to that particular file. From: http://social.msdn.microsoft.com/Forums/en-US/windowsazuretroubleshooting/thread/0fac1f05-eb55-432f-80ac-6f15cde5b14b/
This all suggests that you'll want to check that you've built the correct configuration for deployment on your target environment. Make sure you've targetted x64 for deployment to your data centre servers.
这为我解决了问题。在 VS2013 的开发人员命令提示符中运行此命令。
这将在全局程序集缓存中注册运行时文件,以便所有 .NET 应用程序都可以访问它。
This solved the problem for me. Run this command within the Developer Command Prompt for VS2013.
This will register the runtime files in the Global Assembly Cache so all .NET applications will have access to it.
我刚刚看到这篇文章是因为我遇到了同样的问题 - 不幸的是上述步骤都不适合我。
经过一番绞尽脑汁和胡思乱想后,我找到了解决方案,非常简单/令人尴尬。
我在这里写了关于它的博客 。
点击它!
因此,事实证明,对几个文件进行了一些细微的更改,从而产生了巨大的差异:
schemaVersion
' 已更新。ProductVersion
' 和 'CloudExtensionsDir
' 已更新。我认为对我来说杀手是“
CloudExtensionsDir
”,这已更改为: :
部署到 Azure,立即生效。
希望这有帮助!
PS:我应该补充一点,我不需要卸载任何旧的 SDK 或任何东西,也不需要搞乱“平台目标”。只要改变这个就可以了。
I've just come across this post because I had the same issue - and unfortunately none of the above steps worked for me.
After a bit of head-scratching and messing around - I found the solution, which was remarkably/embarrassingly simple.
I blogged about it here.
CLICK IT!
So, it turns out that some minor changes get made to a few files that make all the difference:
schemaVersion
' is updated.ProductVersion
' and 'CloudExtensionsDir
' are updated.I think the killer was the '
CloudExtensionsDir
' for me, this changed FROM:TO:
Deployed to Azure, worked straight away.
Hope this helps!
PS: I should add, that I didn't need to uninstall any of the old SDK's or anything or mess around with 'Platform Targets'. Just changing this worked fine.
我在处理这个问题很长时间后遇到了这个问题。它帮助了我。
http://mictorino.wordpress.com /2011/09/20/vs2010-build-configurations-and-msshrtmi-dll-x86
I ran across this after dealing with this issue for a long time. It helped me.
http://mictorino.wordpress.com/2011/09/20/vs2010-build-configurations-and-msshrtmi-dll-x86
这个问题困扰了我两天,这里和其他网站上提到的所有解决方案都不起作用。
现在我终于开始工作了。问题是我的机器上安装的 SDK 和工具版本的组合不佳。几天前,我下载了以下内容:
我知道 Azure SDK 是预览版,但一些发行说明让我相信它包含当前版本的(稳定) SDK for Visual Studio 2010。
在我卸载预览版并安装
Windows Azure SDK for .NET (VS 2010 SP1) - June 2012
后,一切运行良好。This problem has bugged me for the last two days, and all solutions mentioned here and on other websites did not work.
Now I finally got it working. The problem was some bad combination of SDKs and tools versions installed on my machine. Some days ago I downloaded the following:
I knew the Azure SDK was a preview, but some release notes made me believe it included the current version of the (stable) SDK for Visual Studio 2010.
After I uninstalled the preview and installed
Windows Azure SDK for .NET (VS 2010 SP1) - June 2012
, everything worked perfectly.引用解决了我们遇到的问题,
我通过简单地添加对C:\Program Files\Microsoft SDKs\Windows Azure.NET SDK\2012-06\bin\runtimes\base\x86\msshrtmi.dll 的
它可能不适用于所有情况但值得一试。
I fixed the issue we were having by simply adding a reference to
C:\Program Files\Microsoft SDKs\Windows Azure.NET SDK\2012-06\bin\runtimes\base\x86\msshrtmi.dll
It probably wont work for all scenarios but is worth a try.