web-dev-qa-db-ja.com

ファイルまたはアセンブリ 'msshrtmi'またはその依存関係の1つを読み込むことができませんでした(Azure Table Storage Access)

データセンターのWebサイトとAzureプラットフォームで実行されているWebサイトの間でトラフィックをリダイレクトするために使用するHTTPModuleがあります。この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」を手動で含めて、データセンターサーバーで使用できるようにしました。

49

Azureプロジェクトはその特定のファイルに非常に敏感であるようです。 From: 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フォルダーに出力されないように、次のいずれかのオプションを試してください。

  1. Webロールプロジェクトのターゲットをx64にし、Azureサービスプロジェクトを再作成します。このオプションは http://social.msdn.Microsoft.com/Forums/en/windowsazure/thread/286cecf6-1423-4ef3-93f9-0eb8a67d8192。 (編集:現在、12年2月時点でリンク切れになっています。)

  2. メモ帳を使用してWebサイトプロジェクトファイルを開き、すべての構成プロパティグループからPlatformTarget要素を削除します。このオプションは http://tomkrueger.wordpress.com/2010/07/27/Azure-deployment-issue-after-upgrading-to-visual-studio-2010-and-net-4-0から引用されています/

  3. ビルドアクションが正常に実行されたときにmsshrtmi.dllを削除するビルド後イベントコマンドを記述します。これを行うには、Webロールプロジェクトを右クリックし、[プロパティ]を選択します。 [ビルドイベント]タブを選択し、[ビルド後のイベントコマンドライン]テキストボックスに次のコマンドを入力します。

cd $(TargetDir)del msshrtmi.dll

これはすべて、ターゲット環境に展開するための正しい構成を構築したことを確認することをお勧めします。データセンターサーバーへの展開用にx64をターゲットにしていることを確認してください。

30
Jeremy McGee

これで問題は解決しました。 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アプリケーションがランタイムファイルにアクセスできるように、ランタイムファイルがグローバルアセンブリキャッシュに登録されます。

19
Gael Fraiteur

私は同じ問題を抱えていたので、この記事に出くわしました-残念ながら上記の手順はどれもうまくいきませんでした

少しひっかいて、いじくり回した後、私はその解決策を見つけました。それは非常に簡単でした。

私はそれについてブログに書いた こちら

  • Azureプロジェクト(青い地球のプロジェクト)を右クリックします。
  • 「アプリケーション」タブをクリックします。
  • 新しいSDKがインストールされていることを通知するボタンがあることに注意してください。 クリックしてください!

そのため、いくつかの小さな変更がいくつかのファイルに対して行われ、すべての違いが生じることがわかりました。

  • 。csdef file-'schemaVersion'が更新されました。
  • 。ccproj-「ProductVersion」および「CloudExtensionsDir」が更新されます。
  • 。csproj-Azure SDK参照が更新されます(ServiceRuntime、Diagnosticsなど)

キラーは私にとって 'CloudExtensionsDir'だったと思う、これはFROMから変更された:

<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をアンインストールする必要はなく、「プラットフォームターゲット」を混乱させる必要もありません。これを変更するだけでうまくいきました。

18
Rob Cooper

この問題に長い間対処した後、私はこれに出くわしました。助けてくれました。

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

3
BZink

最近これを経験し、少なくとも私の場合、このエラーは現在のSDKバージョンよりも古いMicrosoft.WindowsAzure.ServiceRuntimeへの参照が原因であると判断しました。

私のインスタンスでは、SDK 2.2にアップグレードしたばかりですが、ServiceRuntime参照はまだ2.1であり、これらの参照を2.2に更新すると、msshrtmi.dllを参照することなく問題が解決しました。

2
hermiod

クレイジーかもしれませんが、Windows Azure SDK WAS NOT EVEN INSTALLEDであるため、このことが起こりました。愚か、私は知っているが、特定の状況で目を離さないために便利です。

2
Ohad Schneider

この問題は過去2日間私を悩ませており、ここおよび他のWebサイトで言及されているすべてのソリューションは機能しませんでした。

今、私はついにそれを機能させました。問題は、マシンにインストールされている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をインストールした後、すべてが完全に機能しました。

2
cheeesus

参照を追加するだけで問題を修正しました

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

おそらくすべてのシナリオで機能するわけではありませんが、試してみる価値はあります。

2
Lee Englestone

プロジェクトに「_ bin_deployableAssemblies」フォルダーを追加するだけです。このフォルダーにファイル「C:\ Program Files\Microsoft SDKs\Windows Azure.NET SDK\2012-06\bin\runtimes\base\x64\msshrtmi.dll」を配置します。ビルドアクションを「None」に変更し、展開するだけです...

それは私のために働いています...

2
Tuizi

Copy Local」プロパティを「False」に変更しました。そしてそれは私のために働いた。

手順:

  1. リファレンスに移動します。
  2. 参照からdllのプロパティを開きます。
  3. Copy Local」プロパティを「False」に変更します。
0
Dark Matter

Windows Azureと物理ハードウェアの両方に展開可能なソリューションを使用したときに、同様のエラーが発生しました。物理ハードウェアでソリューションを実行しようとすると、エラーが表示されます。この問題は、オンプレミスビルドにはAzureライブラリが必要ではなかったにもかかわらず、Azureライブラリがソリューションの一部であったという事実に起因していました。

簡単な解決策は、Windows Azure SDKを物理ハードウェアにインストールすることです。これにより、欠落しているライブラリがGACにインストールされます

0
Iain Hunter

MsshrtmiをGACに追加することで問題を解決しました。

0
Matej

このソリューションは私のために働く:

  • メモ帳でプロジェクトを開く
  • すべての「PropertyGroup」の下のすべての「PlatformTarget」タグを削除します
0
camaya

GAC msshrtmi.dll[1]のX64バージョンを参照していることを確認することで、この問題を回避できました(プロジェクトで設定されたx64のプラットフォームターゲットに一致させるため)。

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

0
Vishwas Lele

この問題に対する私のソリューションは、msshrtmi.dll(x86とx64の両方)をアプリに同梱し、必要に応じて動的にロードすることでした。

http://jake.ginnivan.net/Azure-and-msshrtmi を参照してください

0
Jake Ginnivan

私は同じ問題を抱えていました。

ソリューションフォルダー/サブフォルダーからすべてのファイル「msshrtmi.dll」を削除してから再構築します。

0
vidalsasoon