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),

Таким образом, у вас уже есть "некоторый код" (менеджер домена), загруженный в каждый из доменов (включая домен приложения по умолчанию).

Другие вопросы по тегам