2013-03-18 1 views
2

У меня есть неуправляемая dll, написанная на C, которая будет введена в управляемое приложение (dotNet 4). Я собираюсь перечислить _AppDomains, работающий в этом приложении, чтобы загрузить некоторый модуль в домен. Он доступен для этого, используя интерфейс ICorRuntimeHost. Однако ICorRuntimeHost устарел и (как описано здесь http://msdn.microsoft.com/en-en/library/ms164320%28v=vs.100%29.aspx) заменен на ICLRRuntimeHost.CLR хостинг. Howto enumerate _AppDomains in .net 4

Как я могу выполнить перечисление _AppDomain с использованием ICLRRuntimeHost? Является ли это возможным?

ответ

3

Среди интерфейсов отладки есть ICorPublish.

Вы можете использовать метод ICorPublish::GetProcess() для извлечения экземпляра ICorPublishProcess для процесса .NET (идентифицируется путем передачи соответствующего идентификатора процесса, который может быть идентификатором текущего процесса, конечно).

Этот интерфейс предоставляет метод ICorPublishProcess::EnumAppDomains(), который вы можете использовать для получения списка текущих доменов приложений в целевом процессе с помощью счетчика до ICorPublishAppDomain экземпляров. Каждый из них имеет метод ICorPublishAppDomain.GetName(), который дает вам имя домена приложения.

Update: Я не пробовал это, но как насчет:

  • Используя подход выше перечислить приложения домены (в том числе получать свой уникальный идентификатор с помощью ICorPublishAppDomain.GetID()).

  • Использование ICLRRuntimeHost::ExecuteInAppDomain для фактического выполнения кода в этом домене (включая загрузку модуля, который вам нужен). Параметром (первым) AppDomainId будет значение, которое вы получите от ICorPublishAppDomain.GetID().

Там, как представляется, по крайней мере, связанные, например, (CppHostCLR) о том, что в Microsoft All-In-One Code Framework над на CodePlex.com

+0

Спасибо, христианин. Я буду помнить об этом интерфейсе, но это не совсем то, что мне нужно. Я хочу защитить (зашифровать) некоторые сетевые модули и загрузить их из неуправляемой dll. Поэтому мне нужно не только перечисление доменов, но и возможность загрузки некоторого кода в указанные домены. –

2

Я хотел бы использовать рекомендованный подход: зарегистрировать свой собственный AppDomainManager с IClrControl::SetAppDomainManagerType, зарегистрировать его на хосте (с AppDomainManagerInitializationOptions.RegisterWithHost), получать уведомления о создании AppDomain и «прослушивать» для разгрузки домена через IActionOnCLREvent::OnEvent(Event_DomainUnload).

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

+1

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

+0

Это была цель :) В последнее время я много работаю с AppDomains, и когда я сталкиваюсь с вопросом AppDomain, я просто отвечаю на него. Это может быть полезно для кого-то, в будущем –

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

  • Нет связанных вопросов^_^