15

我已经在 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 没有自动检测到我的项目需要此文件并为我部署正确的文件?这令人抓狂。

我还要说,我发布的项目不是云服务,而是一个常规的 Azure 网站项目。

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

4

6 回答 6

6

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

  1. 打开解决方案的配置管理器
  2. 选择调试解决方案配置
  3. 为 x64 创建新的解决方案平台
  4. 对于每个 Web 角色和辅助角色项目,将平台设置为 x64
  5. 移除 Any CPU 解决方案平台
  6. 对发布配置进行相同的更改
  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 的依赖。

于 2013-10-29T13:04:09.240 回答
3

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

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

于 2015-03-30T18:13:53.010 回答
1

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

cd $(OutDir)
del msshrtmi.dll

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

于 2013-11-15T11:53:03.627 回答
1

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

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

我希望这将有所帮助。

于 2015-02-09T23:14:36.687 回答
0

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

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

于 2014-06-05T13:53:54.707 回答
0

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

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

于 2015-07-24T14:44:53.167 回答