Обнаружение, если приложение .NET работает в Azure или в среде, отличной от Azure
В настоящее время мы перемещаем некоторые примеры нашего приложения в Azure, но будем поддерживать обратную совместимость с существующими экземплярами, которые не являются Azure.
Есть ли хороший способ обнаружить среду без установки SDK на сервере, не являющемся Azure?
Я пробовал использовать:
if (RoleEnvironment.IsAvailable)
из Microsoft.WindowsAzure.ServiceRuntime, и он отлично работает локально и в Azure. Однако мне нужно установить Microsoft.WindowsAzure.ServiceRuntime.dll в CopyLocal, и даже тогда я получаю:
Не удалось загрузить файл или сборку msshrtmi, Version = 2.2.0.0, Culture = neutral, PublicKeyToken = 31bf3856ad364e35 'или одну из его зависимостей
Кажется, что нет пакета NuGet, и я не хочу вручную копировать файл msshrtmi dll.
Возможно, существует способ обнаружения без зависимости от Microsoft.WindowsAzure.ServiceRuntime?
Ответы
Ответ 1
К сожалению, самый простой способ разрешить это - скопировать файл msshrtmi.dll с:
C:\Program Files\Microsoft SDKs\Windows Azure\.NET SDK\{version}\bin\runtimes\base\x64
Я знаю, что это не очень красивое копирование DLL, но это единственное, что вам нужно для предотвращения ошибки, и ее привязка к используемой версии SDK, поэтому не изменится, пока вы не обновите SDK.
Жизнеспособной альтернативой было бы добавить значение конфигурации в appSettings
и применить конфигурационное преобразование при создании приложения для Azure.
Ответ 2
Вы можете проверить, присутствует ли переменная среды RoleRoot. Если это так, ваше приложение работает в роли Web или Worker.
Ответ 3
Вы можете проверить, используя if(RoleEnvironment.IsEmulated)
Ответ 4
Вы можете попытаться вызвать Assembly.Load на сборке msshrtmi, Version=2.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
, и если это не удается, не пытайтесь вызвать метод RoleEnvironment.IsAvailable(как вы знаете, вы определенно не работаете на Azure).
В качестве альтернативы вы можете попробовать использовать машинное имя, так как все лазурные экземпляры начинаются с "RD"