2

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

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

4

2 回答 2

3

在调试接口中有ICorPublish.

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

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

更新:我还没有尝试过,但是怎么样:

  • 使用上述方法枚举应用程序域(包括通过 获取它们的唯一 ID ICorPublishAppDomain.GetID())。

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

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

于 2013-03-18T14:48:01.633 回答
2

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

这样,您已经将“一些代码”(域管理器)加载到每个域(包括默认的应用程序域)中。

于 2014-12-27T11:20:05.983 回答