CLR хостинг. Как перечислить _AppDomains в.net 4
У меня есть неуправляемая dll, написанная на C, которая будет внедрена в управляемое приложение (dotNet 4). Я собираюсь перечислить _AppDomains
работает в этом приложении, чтобы загрузить какой-либо модуль в домен. Это можно сделать с помощью ICorRuntimeHost
интерфейс. Тем не мение, ICorRuntimeHost
устарела и (как описано там http://msdn.microsoft.com/en-en/library/ms164320%28v=vs.100%29.aspx) заменена на ICLRRuntimeHost
,
Как я могу выступить _AppDomain
перечисление с использованием ICLRRuntimeHost
? Является ли это возможным?
2 ответа
Среди интерфейсов отладки есть ICorPublish
,
Вы можете использовать ICorPublish::GetProcess()
метод для получения ICorPublishProcess
экземпляр для.NET-процесса (определяется путем передачи соответствующего идентификатора процесса, который, конечно, может быть идентификатором текущего процесса).
Этот интерфейс обеспечивает метод ICorPublishProcess::EnumAppDomains()
, который вы можете использовать, чтобы получить список текущих доменов приложений в целевом процессе, через перечислитель для ICorPublishAppDomain
экземпляров. Каждый из которых имеет ICorPublishAppDomain.GetName()
метод, который получает имя домена приложения.
Обновление: я не пробовал это, но как насчет:
Используя описанный выше подход для перечисления доменов приложений (включая получение их уникального идентификатора через
ICorPublishAppDomain.GetID()
).Использование
ICLRRuntimeHost::ExecuteInAppDomain
на самом деле выполнить код в этом домене (включая загрузку модуля вам нужно). (Первый) параметрAppDomainId
будет значение, которое вы получаете отICorPublishAppDomain.GetID()
,
Кажется, есть, по крайней мере, связанный пример (CppHostCLR) об этом в Microsoft All-In-One Code Framework на codeplex.com
Я бы использовал рекомендуемый подход: вы регистрируете свой собственный AppDomainManager с IClrControl::SetAppDomainManagerType
, зарегистрируйтесь на хосте (с AppDomainManagerInitializationOptions.RegisterWithHost
), получать уведомления о создании AppDomain и "прослушивать" выгрузку домена через IActionOnCLREvent::OnEvent(Event_DomainUnload)
,
Таким образом, у вас уже есть "некоторый код" (менеджер домена), загруженный в каждый из доменов (включая домен приложения по умолчанию).