partial class HttpBrowser { public static string IsolateCall(PageContentHandler pHandler) { Contract.Requires(pHandler != null); string name = Guid.NewGuid().ToString("N"); var box = SandboxManager.Create(name, true); try { string entryType = "AnfleCrawler.Common.IsolatedBrowser, AnfleCrawler.Common"; #if DEBUG App.LogInfo("IsolateCall EntryType:{0}", entryType); #endif //string ret = (string)box.Execute(entryType, pHandler); string ret = (string)box.Execute(entryType, "xCross", new object[] { pHandler }); if (ret == null) { throw new InvalidOperationException(string.Format("IsolatedBrowser {0}", entryType)); } return ret; } finally { SandboxManager.Unload(box); #if DEBUG App.LogInfo("IsolateCall Domains:{0}", string.Join("#", GetAppDomains().Select(p => p.FriendlyName))); #endif } } private static IEnumerable<AppDomain> GetAppDomains() { var list = new List<AppDomain>(); IntPtr enumHandle = IntPtr.Zero; var host = new mscoree.CorRuntimeHostClass(); try { host.EnumDomains(out enumHandle); object domain = null; while (true) { host.NextDomain(enumHandle, out domain); if (domain == null) { break; } var appDomain = (AppDomain)domain; list.Add(appDomain); } return list; } finally { host.CloseEnum(enumHandle); System.Runtime.InteropServices.Marshal.ReleaseComObject(host); } } }