Обнаружение, если приложение .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"