Azure SDK 2.2 in Production: Не удалось загрузить файл или сборку msshrtmi или одну из ее зависимостей. Система не может найти указанный файл

Я прочитал об этой проблеме в нескольких других потоках как на StackOverflow, так и на других сайтах. Ни одно из других решений не решило мою проблему, и большинство из них устарели, ссылаясь на старые версии Azure SDK.

У меня есть обычная роль веб-сайта Azure, развернутая в Azure, которая использует Microsoft.WindowsAzure.Diagnostics.DiagnosticMonitorTraceListener для регистрации сообщений трассировки. Когда происходит трассировка, кажется, что DiagnosticMonitorTraceListener использует класс RoleEnvironment, который, в свою очередь, пытается загрузить явно несуществующий msshrtmi.dll. Вот часть трассировки стека, которая записывается в файловую систему в 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

Различные потоки упомянули, как мне нужно очистить эту DLL от моей папки bin, но DLL не копируется в первую очередь. Я подозреваю, что это связано с тем, что я запускаю под Azure SDK 2.2, а не 1.x. Я понимаю, что могу напрямую ссылаться на DLL, но я чувствую, что мне не нужно это делать, чтобы развернуть для Azure вполне нормальный проект. Почему Microsoft не автоматически обнаруживает, что мой проект требует этого файла и для этого вернет мне правильный файл? Это безумие.

Позвольте мне также сказать, что проект, который я публикую, не является облачным сервисом, а скорее обычным проектом веб-сайта Azure.

Кому-нибудь удалось запустить Azure SDK 2.x, чтобы решить эту проблему? Каковы были ваши последующие шаги?

Ответы

Ответ 1

Это похоже на хак, но это был единственный способ решить эту проблему.

  • Откройте Configuration Manager для решения
  • Выберите конфигурацию решения Debug
  • Создайте новую платформу решений для x64
  • Для каждого проекта роли веб-роли и рабочего роли установите платформу на x64
  • Удалите платформу любого процессора.
  • Внесите те же изменения в конфигурацию Release
  • Добавить ссылку на C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\v2.2\bin\runtimes\base\x64\msshrtmi.dll
  • Установите Copy Local в новой ссылке на True

Configuration Manager

EDIT: я закончил удаление кода, который проверял RoleEnvironment; вместо этого я полагаюсь на преобразования Web.config/App.config, чтобы изменять поведение во время выполнения. Это удаляет зависимость от msshrtmi.dll.

Ответ 2

Я также использую SDK 2.2 и развертывание веб-сайта с помощью Visual Studio 2013. В предыдущих проектах у меня были следующие строки в моей командной строке события Postbuild:

cd $(OutDir)
del msshrtmi.dll

Но это больше не решает мою проблему. Dll больше не копируется в папку bin.

Ответ 3

Я столкнулся с той же проблемой. У меня установлен Azure SDK 2.5 на моей машине, но проект создан на SDK 2.2 и ранее был установлен SDK 2.2. Проблема заключается в том, что SDK 2.2 удаляется из GAC и указывает на 2.5. Поэтому я ссылался на Microsoft.WindowsAzure.ServiceRuntime 2.2 и отмечал как "Копировать в local = true", у Ассамблеи есть зависимости от "msshrtmi.dll", поэтому я добавляю событие postbuild в свой проект. Поэтому "msshrtmi.dll" будет скопирован.

Помните, что вам не нужно ссылаться на msshrtmi.dll.

Надеюсь, это поможет.

Ответ 4

Я столкнулся с такой же ошибкой при публикации веб-приложения. Пробовав все другие решения выше, я, наконец, работал у меня:

На портале Azure выберите свое веб-приложение. Выберите "Настройки > Настройки приложения". Измените значение платформы с 32-битного на 64-битное. Повторно опубликовать.

Ответ 5

Я считаю, "Для каждого проекта роли веб-роли и рабочего роли установите платформу для платформы x64 и" Удалить любую платформу для решения ЦП "не требуется.

Важная часть - установка всех собранных сборок Azure SDK и любых сторонних Dll, которые не являются частью платформы .NET, чтобы отметить их как CopyLocal = true; Это решило проблему для меня. И для получения дополнительной информации об ошибках продолжайте проверять журналы событий Azure Virtual Machine в разделе Azure Event. Это даст вам представление о возможной причине сбоя сборки или любых других необработанных ошибок при запуске приложения.

Ответ 6

Удалите все остальные версии Azure SDK и убедитесь, что у вас есть последняя версия.

Это общий конфликт, который делает ссылку на Visual Studio ссылкой на Microsoft.WindowsAzure.ServiceRuntime(в данном случае msshrtmi.dll) на более раннюю версию SDK.