61 votes

Liste des domaines d'application en cours

Est-il possible d'énumérer AppDomains dans Process?

75voto

Brann Points 9983

Vous voudrez peut-être regarder ce post

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

        public static IList<AppDomain> GetAppDomains()
        {
            IList<AppDomain> _IList = new List<AppDomain>();
            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);
            }
        } 
    }
 

10voto

ChrisTorng Points 109

Je l'affine comme ceci:

 using System.Runtime.InteropServices;
using mscoree;

public static IEnumerable<AppDomain> EnumAppDomains()
{
    IList<AppDomain> appDomains = new List<AppDomain>();
    IntPtr enumHandle = IntPtr.Zero;
    ICorRuntimeHost host = null;

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

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

            Marshal.ReleaseComObject(host);
        }
    }
}
 

Appelez ça comme ça:

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

N'oubliez pas de référencer l'objet COM \ WINDOWS \ Microsoft.NET \ Framework \ vXXX \ mscoree.tlb, définissez la référence mscoree "Incorporer les types d'interopérabilité" à "False".

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X