Не удалось загрузить файл или сборку "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 не может загрузить свои данные конфигурации из Table Storage и вместо этого выдает следующую ошибку
---> 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" как часть развертывания, чтобы обеспечить его доступность на серверах центров обработки данных.
15 ответов
Похоже, что проекты 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.
Настройте проект веб-роли на x64 и заново создайте проект службы Azure. Этот вариант был подтвержден
http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/286cecf6-1423-4ef3-93f9-0eb8a67d8192. (изменить: теперь мертвая ссылка по состоянию на февраль 12 года.)Откройте файл проекта веб-сайта с помощью Блокнота и удалите элемент PlatformTarget из всех групп свойств конфигурации. Эта опция цитируется с http://tomkrueger.wordpress.com/2010/07/27/azure-deployment-issue-after-upgrading-to-visual-studio-2010-and-net-4-0/.
Напишите команду события после сборки, чтобы удалить msshrtmi.dll, если действие сборки успешно выполнено. Для этого щелкните правой кнопкой мыши проект веб-роли и выберите "Свойства". Выберите вкладку "События сборки", в текстовом поле "Командная строка события после сборки" введите следующую команду:
cd $(TargetDir)
del msshrtmi.dll
Все это говорит о том, что вы захотите убедиться, что вы создали правильную конфигурацию для развертывания в целевой среде. Убедитесь, что вы выбрали x64 для развертывания на серверах своего центра обработки данных.
Это решило проблему для меня. Запустите эту команду в командной строке разработчика для 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 имели к нему доступ.
Я только что наткнулся на этот пост, потому что у меня была та же проблема - и, к сожалению, ни один из вышеперечисленных шагов не помог мне.
После того, как немного почесал голову и возился - я нашел решение, которое было удивительно / смущающе простым.
Я написал об этом здесь.
- Щелкните правой кнопкой мыши свой проект Azure (проект с голубым шаром).
- Нажмите на вкладку "Приложение".
- Обратите внимание, что есть кнопка, сообщающая, что у вас установлен новый SDK? НАЖМИТЕ НА ЭТО!
Итак, оказывается, что некоторые небольшие изменения были внесены в несколько файлов, которые имеют все значение:
- Файл.csdef - '
schemaVersion
'обновляется. - .ccproj - '
ProductVersion
' а также 'CloudExtensionsDir
'обновляются. - .csproj - ссылки на ваш Azure SDK будут обновлены (ServiceRuntime, Diagnostics и т. д.)
Я думаю, что убийца был CloudExtensionsDir
для меня это изменилось ОТ:
<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 или что-либо еще или возиться с "целями платформы". Просто изменив это работало нормально.
Я столкнулся с этим после решения этой проблемы в течение длительного времени. Это помогло мне.
http://mictorino.wordpress.com/2011/09/20/vs2010-build-configurations-and-msshrtmi-dll-x86
Я испытал это недавно и решил, что, по крайней мере, в моем случае эта ошибка была вызвана ссылкой на Microsoft.WindowsAzure.ServiceRuntime, которая была старше текущей версии SDK.
В моем случае я только что обновился до SDK 2.2, но мои ссылки на ServiceRuntime были все еще 2.1, обновление этих ссылок на 2.2 решило проблему без необходимости ссылаться на msshrtmi.dll.
Я исправил проблему, просто добавив ссылку на
C:\Program Files\Microsoft SDKs\Windows Azure.NET SDK\2012-06\bin\runtimes\base\x86\msshrtmi.dll
Это, вероятно, не будет работать для всех сценариев, но стоит попробовать.
Я могу быть сумасшедшим, но это случилось со мной, потому что Windows Azure SDK НЕ ДАЖЕ УСТАНОВЛЕНО. Глупо, я знаю, но полезно следить в определенных ситуациях.
Просто добавьте папку "_bin_deployableAssemblies" в свой проект. Поместите файл "C: \ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ 2012-06 \ bin \ runtimes \ base \ x64 \ msshrtmi.dll" в эту папку. Измените Build Action на "None" и просто разверните...
Это работа для меня...
Эта проблема беспокоила меня в течение последних двух дней, и все решения, упомянутые здесь и на других сайтах, не работали.
Теперь у меня наконец получилось. Проблема заключалась в том, что на моей машине было установлено плохое сочетание SDK и версий инструментов. Несколько дней назад я скачал следующее:
- Windows Azure Tools 1.7
- Windows Azure SDK Preview для Visual Studio 2012 (июнь 2012 г.)
Я знал, что Azure SDK был предварительным просмотром, но некоторые заметки о выпуске заставили меня поверить, что он включает текущую версию (стабильного) SDK для Visual Studio 2010.
После того, как я удалил предварительный просмотр и установил Windows Azure SDK for .NET (VS 2010 SP1) - June 2012
все работало отлично.
Я изменил свойство "Копировать локально" на "Ложь". И это сработало для меня.
шаги:
- Перейти к ссылке.
- Откройте свойства dll из справочника.
- Измените свойство "Копировать локально" на False.
Я столкнулся с ошибкой симлара при работе с решением, которое можно было развернуть как на Windows Azure, так и на физическом оборудовании. Ошибка будет отображаться при попытке запустить решение на физическом оборудовании. Проблема возникла из-за того, что библиотеки Azure были частью решения, даже если они не требовались для локальной сборки.
Простое решение - установить Windows Azure SDK на физическое оборудование. Это установит недостающие библиотеки в GAC
Это решение работает для меня:
- Откройте проект с помощью блокнота
- Удалите все теги "PlatformTarget" из всех "PropertyGroup"
У меня была такая же проблема.
Из папки / подпапки вашего решения удалите все файлы "msshrtmi.dll" и перестройте.
Моим решением этой проблемы было отправить msshrtmi.dll (как x86, так и x64) вместе с моим приложением, а затем динамически загружать их при необходимости.
Мне удалось обойти эту проблему, убедившись, что я ссылаюсь на версию X64 msshrtmi.dll
в GAC [1]
(чтобы соответствовать целевой платформе x64, установленной в проекте).
[1]
C:\Windows\ сборка \GAC_64\msshrtmi\1.7.0.0__31bf3856ad364e35>