2013-03-18 58 views
2

我有用C写的非托管dll,它将被注入托管应用程序(dotNet 4)。我打算枚举_AppDomains,在此应用程序中运行以将某个模块加载到域中。它可以使用ICorRuntimeHost接口来执行此操作。但是,ICorRuntimeHost已弃用,并且(如http://msdn.microsoft.com/en-en/library/ms164320%28v=vs.100%29.aspx所述)替换为ICLRRuntimeHostCLR托管。如何列举.net中的_AppDomains 4

如何使用ICLRRuntimeHost执行_AppDomain枚举?可能吗?

回答

3

调试接口中有ICorPublish

您可以使用ICorPublish::GetProcess()方法为.NET进程检索ICorPublishProcess实例(当然,通过传递相应的进程ID进行标识,该进程ID可以是当前进程的ID)。

该接口提供方法ICorPublishProcess::EnumAppDomains(),您可以使用获取目标进程中当前应用程序域的列表,通过枚举器获取ICorPublishAppDomain实例。其中每个都有ICorPublishAppDomain.GetName()方法可以让您获得应用程序域的名称。

更新:我没有尝试这样做,但如何:

  • 使用上面的方法来枚举应用程序域(包括通过ICorPublishAppDomain.GetID()得到他们的唯一ID)。

  • 使用ICLRRuntimeHost::ExecuteInAppDomain实际执行该域中的代码(包括加载您需要的模块)。 (第一个)参数AppDomainId将是您从ICorPublishAppDomain.GetID()获得的值。

似乎有一个,至少相关,例如(CppHostCLR)有关,在Microsoft All-In-One Code Framework过上codeplex.com

+0

谢谢,基督徒。我将继续介绍这个界面,但这不完全是我需要的。我想保护(加密)一些netmodules并从非托管dll加载它。所以我不仅需要appdomains枚举,而且需要将一些代码加载到指定的域中。 – 2013-03-18 16:49:24

2

我会使用推荐的方法:你IClrControl::SetAppDomainManagerType注册自己的AppDomainManager,向主机注册(使用AppDomainManagerInitializationOptions.RegisterWithHost),通过IActionOnCLREvent::OnEvent(Event_DomainUnload)接收AppDomain创建通知并“监听”域卸载。

这样,你已经有一些代码加载到每个域(包括默认的appdomain)中。

+1

非常感谢洛伦佐。我甚至忘记了我试图通过这个来完成的事情,但也许这对其他人来说是有用的。 – 2014-12-27 16:54:08

+0

这就是目标:)我最近和AppDomains一起工作了很多,当我遇到一个AppDomain问题时,我只是回答它。这对未来的某个人可能有用 – 2014-12-27 19:31:39

相关问题