Не удалось загрузить файл или сборку 'msshrtmi' или одну из ее зависимостей (доступ к хранилищу таблиц Azure) - PullRequest
48 голосов
/ 25 ноября 2011

У меня есть 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» как часть развертывания, чтобы обеспечить его доступность на серверах центра обработки данных.

Ответы [ 16 ]

30 голосов
/ 26 ноября 2011

Кажется, что проекты Azure очень чувствительны к этому конкретному файлу.From: 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.

  1. Настройте проект веб-роли на x64 и заново создайте проект службы Azure.Эта опция была подтверждена http://social.msdn.microsoft.com/Forums/en/windowsazure/thread/286cecf6-1423-4ef3-93f9-0eb8a67d8192. (редактировать: теперь мертвая ссылка по состоянию на февраль '12.)

  2. Откройте файл проекта веб-сайта с помощью Блокнота и удалитеэлемент PlatformTarget из всех групп свойств конфигурации.Этот параметр указан в http://tomkrueger.wordpress.com/2010/07/27/azure-deployment-issue-after-upgrading-to-visual-studio-2010-and-net-4-0/.

  3. Записать команду события после сборки, чтобы удалить msshrtmi.dll, когда действие сборки успешно выполнено.Для этого щелкните правой кнопкой мыши проект веб-роли и выберите Свойства.Выберите вкладку Build Events, в текстовом поле «Командная строка события после сборки» введите следующую команду:

cd $(TargetDir) del msshrtmi.dll

Все это говорит о том, что вы захотите убедиться, что вы создали правильную конфигурацию для развертывания в целевой среде.Убедитесь, что вы выбрали x64 для развертывания на серверах своего центра обработки данных.

19 голосов
/ 22 октября 2014

Это решило проблему для меня.Запустите эту команду в командной строке разработчика для 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 имели к нему доступ.

18 голосов
/ 26 февраля 2013

Я только что наткнулся на это сообщение, потому что у меня была та же проблема - и, к сожалению , ни один из вышеперечисленных шагов не помог мне .

После того, как немного почесал голову и возился - я нашел решение, которое было удивительно / смущающе простым.

Я писал об этом здесь .

  • Щелкните правой кнопкой мыши свой проект Azure (проект с голубым шаром).
  • Перейдите на вкладку «Приложение».
  • Обратите внимание, что есть кнопка, сообщающая, что у вас установлен новый SDK? НАЖМИТЕ НА ЭТО!

Итак, выясняется, что некоторые небольшие изменения были внесены в несколько файлов, которые имеют все значение:

  • .csdef file - 'schemaVersion' обновлено.
  • .ccproj - обновлены 'ProductVersion' и 'CloudExtensionsDir'.
  • .csproj - ссылки на ваш Azure SDK будут обновлены (ServiceRuntime, диагностика и т. Д.)

Я думаю, что убийца был для меня '1040 *, это изменилось ОТ:

<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 голосов
/ 08 декабря 2011

Я столкнулся с этим после того, как долго занимался этим вопросом. Это помогло мне.

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

2 голосов
/ 25 октября 2013

Я столкнулся с этим недавно и решил, что, по крайней мере, в моем случае эта ошибка была вызвана ссылкой на Microsoft.WindowsAzure.ServiceRuntime, которая была старше текущей версии SDK.

В моем случае я только что обновился до SDK 2.2, но мои ссылки на ServiceRuntime все еще были 2.1, обновление этих ссылок на 2.2 решило проблему без необходимости ссылаться на msshrtmi.dll.

2 голосов
/ 21 мая 2013

Может быть, я сумасшедший, но это случилось со мной, потому что Windows Azure SDK НЕ БЫЛ УСТАНОВЛЕН . Глупо, я знаю, но полезно следить в определенных ситуациях.

2 голосов
/ 08 октября 2012

Просто добавьте папку " _bin_deployableAssemblies " в свой проект. Поместите файл " C: \ Program Files \ Microsoft SDKs \ Windows Azure.NET SDK \ 2012-06 \ bin \ runtimes \ base \ x64 \ msshrtmi.dll " в эту папку. Измените действие сборки на " Нет " и просто разверните ...

Это работа для меня ...

2 голосов
/ 16 июля 2012

Я исправил возникшую проблему, просто добавив ссылку на

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

Это, вероятно, не будет работать для всех сценариев, но стоит попробовать.

2 голосов
/ 25 июня 2012

Эта проблема беспокоила меня в течение последних двух дней, и все решения, упомянутые здесь и на других веб-сайтах, не работали.

Теперь я наконец-то заработал.Проблема заключалась в том, что на моей машине было установлено плохое сочетание 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, все работало отлично.

0 голосов
/ 10 апреля 2019

Я изменил свойство " Copy Local " на " False ".И у меня это сработало.

Шаги:

  1. Перейти к ссылке.
  2. Открыть свойства dll из ссылки.
  3. Изменить свойство " Copy Local " на False .
...