AspNetWebStack/test/Microsoft.TestCommon/AppDomainUtils.cs

75 строки
2.8 KiB
C#

// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO;
using System.Reflection;
using System.Web.Compilation;
using System.Web.Hosting;
namespace System.Web.WebPages.TestUtils
{
public static class AppDomainUtils
{
// Allow a test to modify static fields in an independent appdomain so that
// other tests will not be affected.
public static void RunInSeparateAppDomain(Action action)
{
RunInSeparateAppDomain(new AppDomainSetup(), action);
}
public static void RunInSeparateAppDomain(AppDomainSetup setup, Action action)
{
var dir = Path.GetDirectoryName(typeof(AppDomainUtils).Assembly.CodeBase).Replace("file:\\", "");
setup.PrivateBinPath = dir;
setup.ApplicationBase = dir;
setup.ApplicationName = Guid.NewGuid().ToString();
setup.ShadowCopyFiles = "true";
setup.ShadowCopyDirectories = setup.ApplicationBase;
setup.CachePath = Path.Combine(Path.GetTempPath(), setup.ApplicationName);
AppDomain appDomain = null;
try
{
appDomain = AppDomain.CreateDomain(setup.ApplicationName, null, setup);
AppDomainHelper helper = appDomain.CreateInstanceAndUnwrap(typeof(AppDomainUtils).Assembly.FullName, typeof(AppDomainHelper).FullName) as AppDomainHelper;
helper.Run(action);
}
finally
{
if (appDomain != null)
{
AppDomain.Unload(appDomain);
}
}
}
public class AppDomainHelper : MarshalByRefObject
{
public void Run(Action action)
{
action();
}
}
public static void SetPreAppStartStage()
{
var stage = typeof(BuildManager).GetProperty("PreStartInitStage", BindingFlags.Static | BindingFlags.NonPublic);
var value = ((FieldInfo)typeof(BuildManager).Assembly.GetType("System.Web.Compilation.PreStartInitStage").GetMember("DuringPreStartInit")[0]).GetValue(null);
stage.SetValue(null, value, new object[] { });
SetAppData();
var env = new HostingEnvironment();
}
public static void SetAppData()
{
var appdomain = AppDomain.CurrentDomain;
// Set some dummy values to make the appdomain seem more like a ASP.NET hosted one
appdomain.SetData(".appDomain", "*");
appdomain.SetData(".appId", "appId");
appdomain.SetData(".appPath", "appPath");
appdomain.SetData(".appVPath", "/WebSite1");
appdomain.SetData(".domainId", "1");
}
}
}