【问题标题】:CLR hosting. Howto enumerate _AppDomains in .net 4CLR 托管。如何在 .net 4 中枚举 _AppDomains
【发布时间】:2013-03-06 21:59:40
【问题描述】:

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

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

【问题讨论】:

    标签: .net clr unmanaged clr-hosting


    【解决方案1】:

    调试接口中有ICorPublish

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

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

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

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

    【讨论】:

    • 谢谢,克里斯蒂安。我会记住这个界面,但这并不是我所需要的。我想保护(加密)一些网络模块并从非托管 dll 加载它。所以我不仅需要 appdomains 枚举,还需要将一些代码加载到指定域中的能力。
    【解决方案2】:

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

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

    【讨论】:

    • 非常感谢,洛伦佐。我什至忘记了我试图通过这个来完成什么,但也许这对其他人有用。
    • 那是目标 :) 我最近在 AppDomains 上工作了很多,当我遇到一个 AppDomain 问题时......我只是回答它。将来可能对某人有用
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    相关资源
    最近更新 更多