生产中的Azure SDK 2.2:无法加载文件或程序集“msshrtmi”或其依赖项之一。 该系统找不到指定的文件

我已经在StackOverflow和其他站点上的其他几个线程上读到过这个问题。 其他解决方案都没有解决我的问题,而且大多数已经过时,引用了旧版本的Azure SDK。

我有一个典型的Azure网站角色部署到Azure,使用Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener来记录跟踪消息。 当发生跟踪时,似乎DiagnosticMonitorTraceListener正在使用RoleEnvironment类,而后者又尝试加载显然不存在的msshrtmi.dll 。 以下是在Azure中记录到文件系统的堆栈跟踪的一部分:

 [FileNotFoundException: Could not load file or assembly 'msshrtmi, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' or one of its dependencies. The system cannot find the file specified.] Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.InitializeEnvironment() +0 Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment..cctor() +747 [TypeInitializationException: The type initializer for 'Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment' threw an exception.] Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment.get_IsAvailable() +0 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitor.GetDefaultStartupInfoForCurrentRoleInstance() +23 Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener..ctor() +34 [ConfigurationErrorsException: Could not create Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener, Microsoft.WindowsAzure.Diagnostics, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35.] System.Diagnostics.TraceUtils.GetRuntimeObject(String className, Type baseType, String initializeData) +9004943 System.Diagnostics.TypedElement.BaseGetRuntimeObject() +110 System.Diagnostics.ListenerElement.GetRuntimeObject() +989 System.Diagnostics.ListenerElementsCollection.GetRuntimeObject() +252 System.Diagnostics.TraceInternal.get_Listeners() +331 System.Diagnostics.TraceInternal.WriteLine(String message) +161 Microsoft.WindowsAzure.AzureApplicationSettings..ctor() +437 Microsoft.WindowsAzure.CloudConfigurationManager.get_AppSettings() +137 Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting(String name) +27 TankSoft.EverMarket.EverMarketPrereleaseRole.Endpoints.Api.Notify..ctor() +40 lambda_method(Closure , Object[] ) +60 Autofac.Core.Activators.Reflection.ConstructorParameterBinding.Instantiate() +315 

各种线程已经提到我需要如何从我的bin文件夹中清除这个DLL,但是首先没有复制DLL。 我怀疑这与我在Azure SDK 2.2下运行而不是1.x有关。 我意识到我可以直接引用DLL,但我觉得我不应该这样做,以便将一个非常正常的项目部署到Azure。 为什么Microsoft不会自动检测到我的项目需要此文件并为我部署正确的文件? 这令人抓狂。

我还要说,我发布的项目不是Cloud Service ,而是常规的Azure网站项目。

运行Azure SDK 2.x的人是否设法解决了这个问题? 您遵循的具体步骤是什么?

这感觉就像一个黑客,但这是我能想到解决这个问题的唯一方法。

  1. 打开解决方案的Configuration Manager
  2. 选择调试解决方案配置
  3. 为x64创建新的解决方案平台
  4. 对于每个Web角色和辅助角色项目,将平台设置为x64
  5. 删除Any CPU解决方案平台
  6. 对Release配置进行相同的更改
  7. 添加对C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.2\bin\runtimes\base\x64\msshrtmi.dll
  8. 在新引用上将Copy Local设置为True

配置管理器

编辑 :我最终删除了检查RoleEnvironment的代码; 相反,我依靠Web.config / App.config转换来修改运行时的行为。 这消除了对msshrtmi.dll的依赖。

发布Web App时遇到同样的错误。 在尝试了上述所有其他解决方案之后,以下内容最终对我有用:

在Azure门户中,选择您的Web App。 选择“设置>应用程序设置”。 将Platform值从32位更改为64位。 重新发布。

我也使用SDK 2.2并使用Visual Studio 2013部署网站。在以前的项目中,我在Postbuild事件命令行中有以下几行:

 cd $(OutDir) del msshrtmi.dll 

但这不再解决我的问题了。 dll不再被复制到bin文件夹中。

我遇到了同样的问题。 我在我的机器上安装了Azure SDK 2.5,但该项目是在SDK 2.2上创建的,之前安装了SDK 2.2。 问题是SDK 2.2已从GAC中删除,并指向2.5。 因此,我引用了Microsoft.WindowsAzure.ServiceRuntime 2.2并标记为“Copy to local = true”,程序集依赖于“msshrtmi.dll”,所以我将postbuild事件放在我的项目上。 因此,将复制“msshrtmi.dll”。

请记住,您不需要引用“msshrtmi.dll”。

我希望这将有所帮助。

我认为不需要更改“对于每个Web角色和辅助角色项目,将平台设置为x64并删除任何CPU解决方案平台”。

重要的是设置所有引用的Azure SDK程序集和任何不属于.NET框架的第三方Dll,将它们标记为CopyLocal = true; 这解决了我的问题。 并且有关更多错误信息,请继续在Azure事件部分下检查Azure虚拟机的事件日志。 这将使您了解在应用程序启动时可能导致构建失败或任何其他未处理错误的原因。

卸载所有其他版本的Azure SDK并确保您拥有最新版本。

这是一个常见的冲突,使Visual Studio将Microsoft.WindowsAzure.ServiceRuntime(在本例中为msshrtmi.dll)的一部分引用到旧版本的SDK。