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.