当前位置:  开发笔记 > 开发工具 > 正文

列出正在处理的AppDomain

如何解决《列出正在处理的AppDomain》经验,为你挑选了2个好方法。

是否有可能如何在进程内枚举AppDomains?



1> Brann..:

你可能想看看这篇文章

using System.Runtime.InteropServices;
// Add the following as a COM reference - C:\WINDOWS\Microsoft.NET\Framework\vXXXXXX\mscoree.tlb
using mscoree;                              

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


在.NET 4.0中,您必须使用`ICorRuntimeHost host = new CorRuntimeHost();`替换`CorRuntimeHostClass host = new CorRuntimeHostClass();`.
我只想说谢谢你这段代码.很有用.

2> ChrisTorng..:

我把它改进为:

using System.Runtime.InteropServices;
using mscoree;

public static IEnumerable EnumAppDomains()
{
    IntPtr enumHandle = IntPtr.Zero;
    ICorRuntimeHost host = null;

    try
    {
        host = new CorRuntimeHostClass();
        host.EnumDomains(out enumHandle);
        object domain = null;

        host.NextDomain(enumHandle, out domain);
        while (domain != null)
        {
            yield return (AppDomain)domain;
            host.NextDomain(enumHandle, out domain);
        }
    }
    finally
    {
        if (host != null)
        {
            if (enumHandle != IntPtr.Zero)
            {
                host.CloseEnum(enumHandle);
            }

            Marshal.ReleaseComObject(host);
        }
    }
}

称之为:

foreach (AppDomain appDomain in EnumAppDomains())
{
    // use appDomain
}

记得引用COM对象\ WINDOWS\Microsoft.NET\Framework\vXXX\mscoree.tlb,将引用mscoree"Embed Interop Types"设置为"False".

推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有