如何遍历当前进程中的AppDomain

简介: .Net Framework居然没有提供托管的接口来获取当前进程中的其它AppDomain!所以,我们只有借助承载接口(Hosting Interfaces)来完成这事了。 在MSCOREE.DLL中,.Net 1.0提供了一个ICorRuntimeHost接口,该接口中有EnumDomains和NextDomain方法,而幸运的是:MSCOREE.DLL中居然直接提供了一个Public的实现:CorRuntimeHostClass。

.Net Framework居然没有提供托管的接口来获取当前进程中的其它AppDomain!所以,我们只有借助承载接口(Hosting Interfaces)来完成这事了。
在MSCOREE.DLL中,.Net 1.0提供了一个ICorRuntimeHost接口,该接口中有EnumDomains和NextDomain方法,而幸运的是:MSCOREE.DLL中居然直接提供了一个Public的实现:CorRuntimeHostClass。所以,我们只需要新建一个CorRuntimeHostClass然后调用EnumDomains和NextDomain方法即可:

public static IList<AppDomain> GetAppDomains()
{
    IList<AppDomain> list = new List<AppDomain>();
    IntPtr enumHandle = IntPtr.Zero;
    CorRuntimeHostClass host = new CorRuntimeHostClass();
    try
    {
        host.EnumDomains(out enumHandle);
        object domain = null;
        while (true)
        {
            host.NextDomain(enumHandle, out domain);
            if (domain == null) break;
            AppDomain appDomain = (AppDomain)domain;
            list.Add(appDomain);
        }
        return list;
    }
    catch (Exception e)
    {
        return null;
    }
    finally 
    {
        host.CloseEnum(enumHandle); 
        Marshal.ReleaseComObject(host); 
    }
}

对于MSCOREE.DLL程序集的引用请使用COM引用:C:\WINDOWS\Microsoft.NET\Framework\vXXXXXX\mscoree.tlb
有关MSCOREE.DLL更详细的介绍请参见 .NET中的幕后英雄:MSCOREE.DLL

相关文章
|
3月前
crash —— 输出属于同一个进程的所有线程
crash —— 输出属于同一个进程的所有线程
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”线程它。”
System.InvalidOperationException:“线程间操作无效: 从不是创建控件“xxx”线程它。”
542 0
|
7月前
|
Linux Shell 程序员
【进程控制】进程程序替换的原理以及exec函数族
【进程控制】进程程序替换的原理以及exec函数族
|
7月前
线程间通信实例之轮流打印ABC
线程间通信实例之轮流打印ABC
51 0
|
存储 调度
程序、进程、线程的区别
程序、进程、线程的区别
494 3
|
Java
线程和进程概念区别—及线程常用方法和状态
进程和线程是操作系统中的两个基本概念。 进程是程序执行的基本单位,每个进程都有自己独立的内存空间和系统资源,它拥有自己的虚拟地址空间、代码段、数据段、堆栈段等。一个程序可以对应多个进程,每个进程之间是独立运行的,互相之间不会影响。
304 0
|
安全 调度
【引用】如何结束线程运行(转)
【引用】如何结束线程运行(转)
98 0
|
Java Android开发
AIDL的思考——asInterface判断是否为同一个进程的依据+不同进程是怎么访问到asInterface方法的
asInterface判断是否为同一个进程的依据。 由此引出我的三个问题:1)asInterface 方法的参数指的是谁;2)AMS,为什么不能直接实例化AMS然后调用其StartActivity方法呢,而是要调用 asInterface(某IBinder对象).startActivity 方法呢?3)asInterface()方法,是怎么判断出 AMS 是在不同的进程中的呢?
AIDL的思考——asInterface判断是否为同一个进程的依据+不同进程是怎么访问到asInterface方法的
|
Unix
进程process pid 与线程(一)——进程概念(以后查一下进程表是如何实现的)
进程,是对正在运行的程序的一个抽象。   进程   CPU由一个进程快速切换至另一个进程,使得每个进程运行几十或几百毫秒,从而产生一种并行的错觉。
1237 0
|
Java Linux
从JVM heap dump里查找没有关闭文件的引用
背景 最近排查一个文件没有关闭的问题,记录一下。 哪些文件没有关闭是比较容易找到的,查看进程的fd(File Descriptor)就可以。
1513 0