不写名字也要依赖于配置文件或者工厂模式,不可能所有都是抽象的!这个或许对你有帮助:
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
using System.Runtime.Remoting;
class App {
static Assembly TypeResolveHandler(Object sender, ResolveEventArgs e) {
Console.WriteLine("In TypeResolveHandler"); AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "DynamicAssem"; // Create a new assembly with one module
AssemblyBuilder newAssembly =
Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder newModule = newAssembly.DefineDynamicModule("DynamicModule"); // Define a public class named "ANonExistentType" in the assembly.
TypeBuilder myType = newModule.DefineType("ANonExistentType", TypeAttributes.Public); // Define a method on the type to call
MethodBuilder simpleMethod = myType.DefineMethod("SimpleMethod", MethodAttributes.Public, null, null);
ILGenerator il = simpleMethod.GetILGenerator();
il.EmitWriteLine("Method called in ANonExistentType");
il.Emit(OpCodes.Ret); // Bake the type
myType.CreateType(); return newAssembly;
} static void Main() {
// Hook up the event handler
Thread.GetDomain().AssemblyResolve +=new ResolveEventHandler(App.TypeResolveHandler); // Find a type that should be in our assembly but isn't
ObjectHandle oh = Activator.CreateInstance("DynamicAssem", "ANonExistentType"); Type mt = oh.Unwrap().GetType(); // Construct an instance of a type
Object objInstance = Activator.CreateInstance(mt); // Find a method in this type and call it on this object
MethodInfo mi = mt.GetMethod("SimpleMethod");
mi.Invoke(objInstance, null);
Console.Read();
}
}
using System;
using System.Reflection;
using System.Reflection.Emit;
using System.Threading;
using System.Runtime.Remoting;
class App {
static Assembly TypeResolveHandler(Object sender, ResolveEventArgs e) {
Console.WriteLine("In TypeResolveHandler"); AssemblyName assemblyName = new AssemblyName();
assemblyName.Name = "DynamicAssem"; // Create a new assembly with one module
AssemblyBuilder newAssembly =
Thread.GetDomain().DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.Run);
ModuleBuilder newModule = newAssembly.DefineDynamicModule("DynamicModule"); // Define a public class named "ANonExistentType" in the assembly.
TypeBuilder myType = newModule.DefineType("ANonExistentType", TypeAttributes.Public); // Define a method on the type to call
MethodBuilder simpleMethod = myType.DefineMethod("SimpleMethod", MethodAttributes.Public, null, null);
ILGenerator il = simpleMethod.GetILGenerator();
il.EmitWriteLine("Method called in ANonExistentType");
il.Emit(OpCodes.Ret); // Bake the type
myType.CreateType(); return newAssembly;
} static void Main() {
// Hook up the event handler
Thread.GetDomain().AssemblyResolve +=new ResolveEventHandler(App.TypeResolveHandler); // Find a type that should be in our assembly but isn't
ObjectHandle oh = Activator.CreateInstance("DynamicAssem", "ANonExistentType"); Type mt = oh.Unwrap().GetType(); // Construct an instance of a type
Object objInstance = Activator.CreateInstance(mt); // Find a method in this type and call it on this object
MethodInfo mi = mt.GetMethod("SimpleMethod");
mi.Invoke(objInstance, null);
Console.Read();
}
}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货