我有一些非常简单的代码来生成程序集并在包含的类型上调用方法.该方法被调用并正确运行,但是当我使用Reflector查看生成的程序集时,我看不到该类型.
以下是示例代码:
namespace ConsoleApplication2 { class Proggy { public static void Main(string[] args) { var ab = AppDomain.CurrentDomain.DefineDynamicAssembly( new AssemblyName() { Name = "MyAssembly" }, AssemblyBuilderAccess.RunAndSave); var module = ab.DefineDynamicModule(ab.GetName().Name); var typeBuilder = module.DefineType("MyType"); var ctr = typeBuilder.DefineConstructor(MethodAttributes.Public, CallingConventions.Standard, Type.EmptyTypes); var ilgc = ctr.GetILGenerator(); ilgc.Emit(OpCodes.Ldarg_0); ilgc.Emit(OpCodes.Call, typeof(object).GetConstructor(Type.EmptyTypes)); ilgc.Emit(OpCodes.Ret); var method = typeBuilder.DefineMethod("MyMethod", MethodAttributes.Public, typeof(int), new[] { typeof(string) }); var ilg = method.GetILGenerator(); ilg.Emit(OpCodes.Ldarg_1); ilg.EmitCall(OpCodes.Callvirt, typeof(string).GetProperty("Length").GetGetMethod(), null); ilg.Emit(OpCodes.Ret); var type = typeBuilder.CreateType(); ab.Save("mytestasm.dll"); var inst = Activator.CreateInstance(type); Console.WriteLine(type.InvokeMember("MyMethod", BindingFlags.InvokeMethod, null, inst, new[] { "MyTestString" })); Console.ReadLine(); } } }
这里是Reflector的相应反汇编:
.assembly MyAssembly { .ver 0:0:0:0 .hash algorithm 0x00008004 } .module RefEmit_OnDiskManifestModule // MVID: {0B944140-58D9-430E-A867-DE0AD0A8701F} // Target Runtime Version: v2.0.50727
......而且......
{ .class private auto ansi{ } }
任何人都可以帮助我正确保存装配?
诀窍是在AssemblyBuilder实例上使用DefineDynamicModule方法的"可持久模块"版本.也就是说,而不是:
var module = ab.DefineDynamicModule(ab.GetName().Name);
使用类似的东西:
var module = ab.DefineDynamicModule(ab.GetName().Name, ab.GetName().Name + ".mod");
此后,保存后相应的模块将出现在组件中.