2015-12-17 3 views
2

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

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

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

+0

Некоторые программисты слишком стараются, чтобы избежать использования переменной * bool *. Нет «или что-то». –

+0

@HansPassant Так как это для целей тестирования, обычно есть * или что-то еще, даже если вы непреклонно уверены, что не должно быть. – GregRos

ответ

3

Я считаю, что вы можете использовать комбинацию хранения ссылок 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); 

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

// "false" is "unloaded" 
if(!appDomainState[someAppDomainId]) 
{ 
} 
+0

Благодарим за предложение. Я сделаю это, если нет прямого способа проверить, был ли домен выгружен (поскольку он предназначен для тестирования, тем меньше точек отказа, тем лучше). – GregRos

+0

@GregRos Нет проблем. Если я не ошибаюсь, это будет вашим лучшим выбором. Очевидно, вы можете изменить способ хранения состояния AppDomain: это может быть словарь, как я вам предложил, список классов с использованием настраиваемого типа «AppDomainState», который может иметь свойство «Unloaded» ... –

1

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

Смежные вопросы