我有用C编写的非托管dll,它将被注入托管应用程序(dotNet 4)。我将枚举_AppDomains
,在此应用程序中运行以将一些模块加载到域中。可以使用ICorRuntimeHost
接口执行此操作。但是,ICorRuntimeHost
已弃用,并且(如http://msdn.microsoft.com/en-en/library/ms164320%28v=vs.100%29.aspx所述)已替换为ICLRRuntimeHost
。
如何使用_AppDomain
执行ICLRRuntimeHost
枚举?有可能吗?
答案 0 :(得分:3)
在调试接口中有ICorPublish
。
您可以使用ICorPublish::GetProcess()
方法检索.NET进程的ICorPublishProcess
实例(通过传递相应的进程ID来标识,当然,这可以是当前进程的ID)。
该接口提供方法ICorPublishProcess::EnumAppDomains()
,您可以使用枚举器向ICorPublishAppDomain
实例获取目标进程中当前应用程序域的列表。每个方法都有ICorPublishAppDomain.GetName()
方法,可以获取应用程序域的名称。
更新:我还没试过,但是怎么样:
使用上述方法枚举应用领域(包括通过ICorPublishAppDomain.GetID()
获取其唯一ID)。
使用ICLRRuntimeHost::ExecuteInAppDomain
实际执行该域中的代码(包括加载您需要的模块)。 (第一个)参数AppDomainId
将是您从ICorPublishAppDomain.GetID()
获得的值。
在codeplex.com上Microsoft All-In-One Code Framework以上似乎有一个(至少是相关的)示例(CppHostCLR)
答案 1 :(得分:2)
我会使用推荐的方法:您使用IClrControl::SetAppDomainManagerType
注册自己的AppDomainManager,使其注册到主机(使用AppDomainManagerInitializationOptions.RegisterWithHost
),接收AppDomain创建通知和" listen&#34 ;通过IActionOnCLREvent::OnEvent(Event_DomainUnload)
进行域名卸载。
那样,你已经有了#34;一些代码" (域管理器)加载到每个域(包括默认的appdomain)。