Не удалось загрузить файл или сборку "msshrtmi" или одну из его зависимостей (доступ к хранилищу таблиц Azure)
У меня есть HTTPModule, который я использую для перенаправления трафика между веб-сайтом в моем центре обработки данных и веб-сайтом, работающим на платформе Azure. Этот 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" как часть развертывания, чтобы обеспечить его доступность на серверах центров обработки данных.
Ответы
Ответ 1
Кажется, что проекты Azure очень чувствительны к этому конкретному файлу. От: http://social.msdn.microsoft.com/Forums/en-US/windowsazuretroubleshooting/thread/0fac1f05-eb55-432f-80ac-6f15cde5b14b/
Когда вы выполните перестройку для проекта веб-роли, могу ли я попросить вас проверить если файл msshrtmi.dll в папке bin или нет? Если да, то пожалуйста проверьте, является ли он 64-битным или 32-битным, используя Dependency Walker. Если это 32 бит, попробуйте выполнить одну из следующих опций, чтобы предотвратить вывод этого dll в папку bin.
cd $(TargetDir)
del msshrtmi.dll
Все это говорит о том, что вы захотите проверить, что вы построили правильную конфигурацию для развертывания в своей целевой среде. Убедитесь, что вы настроили x64 для развертывания на серверах центров обработки данных.
Ответ 2
Я только что наткнулся на этот пост, потому что у меня была такая же проблема - и, к сожалению, ни один из вышеперечисленных шагов не работал у меня.
После небольшого поцарапания головы и возиться - я нашел решение, которое было удивительно/неловко просто.
Я написал об этом здесь.
- Щелкните правой кнопкой мыши проект 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>
TO:
<CloudExtensionsDir Condition=" '$(CloudExtensionsDir)' == '' ">
$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Windows Azure Tools\1.8\
</CloudExtensionsDir>
Развернутый до Azure, работал сразу.
Надеюсь, это поможет!
PS: Я должен добавить, что мне не нужно было удалять какой-либо старый SDK или что-либо или беспорядок с помощью "Платформенных целей". Просто это изменилось.
Ответ 3
Это решило проблему для меня. Запустите эту команду в командной строке разработчика для 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 имели к нему доступ.
Ответ 4
Я столкнулся с этим после долгого решения этой проблемы. Это помогло мне.
http://mictorino.wordpress.com/2011/09/20/vs2010-build-configurations-and-msshrtmi-dll-x86
Ответ 5
Эта проблема прослушивала меня в течение последних двух дней, и все решения, упомянутые здесь и на других сайтах, не работали.
Теперь я, наконец, начал работать. Проблема заключалась в некорректной комбинации версий SDK и инструментов, установленных на моей машине. Несколько дней назад я загрузил следующее:
- Windows Azure Tools 1.7
- Предварительный просмотр Windows Azure SDK для Visual Studio 2012 (июнь 2012 г.)
Я знал, что Azure SDK был предварительным просмотром, но некоторые заметки о выпуске заставили меня поверить, что в него включена текущая версия (стабильного) SDK для Visual Studio 2010.
После того как я удалил предварительный просмотр и установил Windows Azure SDK for .NET (VS 2010 SP1) - June 2012
, все работало отлично.
Ответ 6
Я исправил проблему, которую мы имели, просто добавив ссылку на
C:\Program Files\Microsoft SDKs\Windows Azure.NET SDK\2012-06\bin\runtimes\base\x86\msshrtmi.dll
Вероятно, он не будет работать для всех сценариев, но стоит попробовать.
Ответ 7
Просто добавьте папку _bin_deployableAssemblies в свой проект. Поместите в эту папку файл " C:\Program Files\Microsoft SDK\Windows Azure.NET SDK\2012-06\bin\runtimes\base\x64\msshrtmi.dll". Измените действие сборки на " Нет" и просто разверните...
Это работает для меня...
Ответ 8
Я могу быть сумасшедшим, но это случилось со мной, потому что Windows Azure SDK НЕ УСТАНАВЛИВАЕТСЯ. Глупо, я знаю, но полезно следить за ними в определенных ситуациях.
Ответ 9
Я испытал это недавно и решил, что в моем случае, по крайней мере, эта ошибка была вызвана ссылкой на Microsoft.WindowsAzure.ServiceRuntime, которая была старше текущей версии SDK.
В моем экземпляре я только что обновился до SDK 2.2, но мои ссылки ServiceRuntime по-прежнему были 2.1, обновление этих ссылок на 2.2 разрешило проблему без необходимости ссылаться на msshrtmi.dll.
Ответ 10
У меня возникла ошибка simlar при работе с решением, которое можно было развертывать как для Windows Azure, так и для физического оборудования. Ошибка при попытке запустить решение на физическом оборудовании. Проблема возникла из-за того, что библиотеки Azure были частью решения, хотя они не требовались для сборки на месте.
Простым решением является установка Windows Azure SDK на физическое оборудование. Это приведет к установке недостающих библиотек в GAC
Ответ 11
Это решение работает для меня:
- Откройте проект с помощью блокнота
- Удалите все теги "PlatformTarget" под всеми "PropertyGroup"
Ответ 12
Мое решение этой проблемы состояло в том, чтобы отправить msshrtmi.dll(и x86 и x64) с моим приложением, а затем динамически загружать их при необходимости.
См. http://jake.ginnivan.net/azure-and-msshrtmi
Ответ 13
Я решил проблему, добавив msshrtmi в GAC.
Ответ 14
Мне удалось обойти эту проблему, убедившись, что я ссылался на версию X64 msshrtmi.dll
в GAC [1]
(чтобы соответствовать целевой платформе x64, установленной в проекте).
[1]
c:\Windows\assembly\GAC_64\msshrtmi\1.7.0.0__31bf3856ad364e35 >
Ответ 15
У меня была та же проблема.
Из папки/подкаталогов решения удалите все файлы msshrtmi.dll, а затем перестройте.
Ответ 16
Я изменил свойство " Копировать локально " на " Ложь ". И это сработало для меня.
шаги:
- Перейти к ссылке.
- Откройте свойства dll из справочника.
- Измените свойство " Копировать локально " на False.