a575963da9
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
105 lines
4.2 KiB
C#
105 lines
4.2 KiB
C#
// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
|
|
|
|
using System.Reflection;
|
|
using System.Reflection.Emit;
|
|
|
|
namespace System.Web.Mvc.Test
|
|
{
|
|
internal static class MvcTestHelper
|
|
{
|
|
private static bool _mvcAssembliesCreated;
|
|
|
|
public static void CreateMvcAssemblies()
|
|
{
|
|
// Only create MVC assemblies once per appdomain. This method is called from the static ctor of several
|
|
// test classes.
|
|
if (_mvcAssembliesCreated)
|
|
{
|
|
return;
|
|
}
|
|
|
|
CreateMvcTestAssembly1();
|
|
CreateMvcTestAssembly2();
|
|
CreateMvcTestAssembly3();
|
|
CreateMvcTestAssembly4();
|
|
|
|
_mvcAssembliesCreated = true;
|
|
}
|
|
|
|
private static void CreateMvcTestAssembly1()
|
|
{
|
|
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
|
|
new AssemblyName("MvcAssembly1"),
|
|
AssemblyBuilderAccess.Save);
|
|
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(
|
|
"MvcAssembly1", "MvcAssembly1.dll");
|
|
|
|
CreateController(moduleBuilder, "NS1a.NS1b.C1Controller");
|
|
CreateController(moduleBuilder, "NS2a.NS2b.C2Controller");
|
|
|
|
assemblyBuilder.Save("MvcAssembly1.dll");
|
|
}
|
|
|
|
private static void CreateMvcTestAssembly2()
|
|
{
|
|
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
|
|
new AssemblyName("MvcAssembly2"),
|
|
AssemblyBuilderAccess.Save);
|
|
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(
|
|
"MvcAssembly2", "MvcAssembly2.dll");
|
|
|
|
CreateController(moduleBuilder, "NS3a.NS3b.C3Controller");
|
|
CreateController(moduleBuilder, "NS4a.NS4b.C4Controller");
|
|
|
|
assemblyBuilder.Save("MvcAssembly2.dll");
|
|
}
|
|
|
|
private static void CreateMvcTestAssembly3()
|
|
{
|
|
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
|
|
new AssemblyName("MvcAssembly3"),
|
|
AssemblyBuilderAccess.Save);
|
|
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(
|
|
"MvcAssembly3", "MvcAssembly3.dll");
|
|
|
|
// Type names (but not namespaces) are the same as those in TestAssembly1
|
|
CreateController(moduleBuilder, "NS3a.NS3b.C1Controller");
|
|
CreateController(moduleBuilder, "NS4a.NS4b.C2Controller");
|
|
|
|
assemblyBuilder.Save("MvcAssembly3.dll");
|
|
}
|
|
|
|
private static void CreateMvcTestAssembly4()
|
|
{
|
|
AssemblyBuilder assemblyBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(
|
|
new AssemblyName("MvcAssembly4"),
|
|
AssemblyBuilderAccess.Save);
|
|
ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule(
|
|
"MvcAssembly4", "MvcAssembly4.dll");
|
|
|
|
// Namespaces and type names are the same as those in TestAssembly1
|
|
CreateController(moduleBuilder, "NS1a.NS1b.C1Controller");
|
|
CreateController(moduleBuilder, "NS2a.NS2b.C2Controller");
|
|
|
|
assemblyBuilder.Save("MvcAssembly4.dll");
|
|
}
|
|
|
|
private static void CreateController(ModuleBuilder moduleBuilder, string typeName)
|
|
{
|
|
//namespace {namespace} {
|
|
// public class {typename} : ControllerBase {
|
|
// protected virtual void ExecuteCore() {
|
|
// return;
|
|
// }
|
|
// }
|
|
//}
|
|
|
|
TypeBuilder controllerTypeBuilder = moduleBuilder.DefineType(typeName, TypeAttributes.Class | TypeAttributes.Public, typeof(ControllerBase));
|
|
MethodBuilder executeMethodBuilder = controllerTypeBuilder.DefineMethod("ExecuteCore", MethodAttributes.Family | MethodAttributes.Virtual, typeof(void), Type.EmptyTypes);
|
|
executeMethodBuilder.GetILGenerator().Emit(OpCodes.Ret);
|
|
controllerTypeBuilder.DefineMethodOverride(executeMethodBuilder, typeof(ControllerBase).GetMethod("ExecuteCore", BindingFlags.Instance | BindingFlags.NonPublic));
|
|
controllerTypeBuilder.CreateType();
|
|
}
|
|
}
|
|
}
|