Est-il possible d'énumérer AppDomains dans Process?
Réponses
Trop de publicités?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);
}
}
}
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".