获取所有进程及其对应的应用程序域

Posted

技术标签:

【中文标题】获取所有进程及其对应的应用程序域【英文标题】:Get All Processes With Their Corresponding App Domains 【发布时间】:2013-02-07 19:03:08 【问题描述】:

是否可以在运行程序时获取正在运行的进程及其对应的应用程序域的列表?我知道 mscoree.dll 允许我使用 ICorRuntimeHost.EnumDomains 方法检索 当前 进程的所有应用程序域。有没有办法不使用使用外部 API 和纯 C# 代码来获取这些信息?我知道 mdbg 有一些功能可能会有所帮助,但我不确定如何使用这个调试器。我真的在寻找仅使用 C# 的解决方案。

谢谢

编辑: 目标是在 html 页面上显示每个进程及其相应的应用程序域。理想情况下,会有一个函数遍历所有正在运行的进程并检索此信息。

检索当前进程的所有应用程序域的代码:

    private static List<AppDomainInf> GetAppDomains()
    
        IList<AppDomain> mAppDomainsList = new List<AppDomain>();
        List<AppDomainInf> mAppDomainInfos = new List<AppDomainInf>();

        IntPtr menumHandle = IntPtr.Zero;
        ICorRuntimeHost host = new CorRuntimeHost();

        try
        
            host.EnumDomains(out menumHandle);
            object mTempDomain = null;

            //add all the current app domains running
            while (true)
            
                host.NextDomain(menumHandle, out mTempDomain);
                if (mTempDomain == null) break;
                AppDomain tempDomain = mTempDomain as AppDomain;
                mAppDomainsList.Add((tempDomain));
            

            //retrieve every app domains detailed information
            foreach (var appDomain in mAppDomainsList)
            
                AppDomainInf domainInf = new AppDomainInf();

                domainInf.Assemblies = GetAppDomainAssemblies(appDomain);
                domainInf.AppDomainName = appDomain.FriendlyName;

                mAppDomainInfos.Add(domainInf);
            

            return mAppDomainInfos;
        
        catch (Exception)
        
            throw; //rethrow
        
        finally
        
            host.CloseEnum(menumHandle);
            Marshal.ReleaseComObject(host);
        
    

【问题讨论】:

这需要一个调试函数,ICorDebugProcess::EnumerateAppDomains()。当然有更好的方法来实现你想要的,但是这段代码的目标是完全不可见的。 感谢您的建议,但我希望尽可能避免使用任何 C++ 库或导入。 【参考方案1】:

使用位于 C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\MdbgCore.dll 中的 MdbgCore.dll。:

CorPublish cp = new CorPublish();
foreach (CorPublishProcess process in cp.EnumProcesses())
            
                    foreach (CorPublishAppDomain appDomain in process.EnumAppDomains())
                    

                    
                

【讨论】:

以上是关于获取所有进程及其对应的应用程序域的主要内容,如果未能解决你的问题,请参考以下文章

Java 获取对象的所有属性及其对应的值

为另一个 .NET 框架进程获取 AppDomain

列出所有进程及其当前的内存和 CPU 消耗?

多线程基础

变量的声明及其作用域脚本修改环境变量$PATH:VALUE

插件式框架探索系列应用程序域(AppDomain)