【发布时间】:2015-11-24 09:47:49
【问题描述】:
如何在不引用mscoree 的情况下枚举所有进程的域。是否可以?我在互联网的某个地方找到了 2007 年的一些解决方案。但它会枚举并清空集合。
代码如下:
public static class DomainHelper
{
public static AppDomain[] LoadedDomains
{
get
{
var loadedDomains = new List<AppDomain>();
var runtimeHost = new CorRuntimeHost() as ICorRuntimeHost;
try
{
var enumeration = IntPtr.Zero;
runtimeHost.EnumDomains(out enumeration);
try
{
object nextDomain = null;
runtimeHost.NextDomain(enumeration, ref nextDomain);
while (nextDomain != null)
{
loadedDomains.Add((AppDomain) nextDomain);
nextDomain = null;
runtimeHost.NextDomain(enumeration, ref nextDomain);
}
}
finally
{
runtimeHost.CloseEnum(enumeration);
}
}
finally
{
Marshal.ReleaseComObject(runtimeHost);
}
return loadedDomains.ToArray();
}
}
[ComImport]
[Guid("CB2F6723-AB3A-11d2-9C40-00C04FA30A3E")]
private class CorRuntimeHost // : ICorRuntimeHost
{}
[Guid("CB2F6722-AB3A-11D2-9C40-00C04FA30A3E")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
private interface ICorRuntimeHost
{
void CloseEnum(IntPtr enumHandle);
void CreateDomain();
void CreateDomainEx();
void CreateDomainSetup();
void CreateEvidence();
void CreateLogicalThreadState();
void CurrentDomain();
void DeleteLogicalThreadState();
void EnumDomains(out IntPtr enumHandle);
void GetConfiguration();
void GetDefaultDomain();
void LocksHeldByLogicalThread();
void MapFile();
void NextDomain(IntPtr enumHandle, [MarshalAs(UnmanagedType.IUnknown)] ref object appDomain);
void Start();
void Stop();
void SwitchInLogicalThreadState();
void SwitchOutLogicalThreadState();
void UnloadDomain();
}
}
【问题讨论】: