Как проверить, выгружен ли AppDomain?

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

Иногда я хочу проверить, выгружал ли я домен приложения в прошлом (или он каким-то образом выгружался сам по себе или что-то в этом роде) в целях тестирования. Есть ли способ сделать это?

Очевидный способ - сделать что-то, что вызовет AppDomainUnloadedException, но я надеюсь, что есть другой способ.


person GregRos    schedule 17.12.2015    source источник
comment
Некоторые программисты слишком стараются избегать использования переменной bool. Нет или что-то в этом роде.   -  person Hans Passant    schedule 17.12.2015
comment
@HansPassant Так как это для целей тестирования, обычно есть или что-то в этом роде, даже если вы категорически уверены, что его не должно быть.   -  person GregRos    schedule 17.12.2015


Ответы (2)


Я считаю, что вы можете использовать комбинацию хранения ссылок AppDomain в некотором заданном Dictionary<AppDomain, bool>, где bool, если он загружен или выгружен, и обрабатывать событие AppDomain.DomainUnload.

Dictionary<AppDomain, bool> appDomainState = new Dictionary<AppDomain, bool>();

AppDomain appDomain = ...; // AppDomain creation
appDomain.DomainUnload += (sender, e) => appDomainState[appDomain] = false;
appDomainState.Add(appDomain, true);

Таким образом, вы сможете проверить, выгружен ли AppDomain:

// "false" is "unloaded"
if(!appDomainState[appDomainReference]) 
{
}

В качестве альтернативы вы можете использовать AppDomain.Id в качестве ключа:

Dictionary<int, bool> appDomainState = new Dictionary<int, bool>();

AppDomain appDomain = ...; // AppDomain creation
appDomain.DomainUnload += (sender, e) => appDomainState[appDomain.Id] = false;
appDomainState.Add(appDomain.Id, true);

... и оператор if будет выглядеть следующим образом:

// "false" is "unloaded"
if(!appDomainState[someAppDomainId]) 
{
}
person Matías Fidemraizer    schedule 17.12.2015
comment
Спасибо за предложение. Я сделаю это, если нет прямого способа проверить, выгружен ли домен (поскольку это для целей тестирования, чем меньше точек сбоя, тем лучше). - person GregRos; 17.12.2015
comment
@GregRos Нет проблем. Если я не ошибаюсь, это будет ваш лучший выбор. Очевидно, вы можете изменить способ хранения состояния AppDomain: это может быть словарь, как я вам предлагал, список классов, использующий настраиваемый тип AppDomainState, который может иметь свойство _3 _... - person Matías Fidemraizer; 17.12.2015

Вы можете перечислить все домены приложений в своей программе с помощью кода из этой ссылки stackoverflow. Затем вы можете сравнить их по ID или FriendlyName или что-то подобное.

person Dieter Meemken    schedule 17.12.2015