15

I have read about this problem on several other threads both on StackOverflow and other sites. None of the other solutions have solved my problem and most are outdated, referencing old versions of the Azure SDK.

I have a typical Azure website role deployed to Azure that uses Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener to log trace messages. When tracing occurs, it appears as though DiagnosticMonitorTraceListener is using the RoleEnvironment class, which in turn tries to load the apparently non-existent msshrtmi.dll. Here is a portion of the stack trace that is being logged to the file system in 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

Various threads have mentioned how I need to clean this DLL from my bin folder, but the DLL is not being copied in the first place. I suspect this has to do with me running under Azure SDK 2.2 and not 1.x. I realize I can reference the DLL directly but I feel that I should not have to do this in order to deploy what is a quite normal project to Azure. Why is Microsoft not automatically detecting that my project requires this file and deploying the correct file for me? This is maddening.

Let me also say that the project I am publishing is not a Cloud Service but rather a regular Azure website project.

Has anyone running Azure SDK 2.x managed to solve this issue? What were the exact steps you followed?

4

6 に答える 6

6

これはハックのように感じますが、この問題を解決するために私が考えることができる唯一の方法でした.

  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 に答える
1

また、SDK 2.2 を使用し、Visual Studio 2013 を使用して Web サイトを展開しています。以前のプロジェクトでは、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 がインストールされていました。問題は、SDK 2.2 が GAC から削除され、2.5 を指していることです。そのため、Microsoft.WindowsAzure.ServiceRuntime 2.2 を参照し、"Copy to local=true" としてマークします。アセンブリは "msshrtmi.dll" に依存しているため、プロジェクトにビルド後のイベントを配置しました。したがって、「msshrtmi.dll」がコピーされます。

「msshrtmi.dll」を参照する必要はありません。

これが役立つことを願っています。

于 2015-02-09T23:14:36.687 に答える
0

「Web ロールとワーカー ロール プロジェクトごとに、プラットフォームを x64 に設定し、Any CPU ソリューション プラットフォームを削除する」を変更する必要はないと思います。

重要な部分は、参照されたすべての Azure SDK アセンブリと、.NET フレームワークの一部ではないサード パーティの 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 に答える