.net - 程序集未正确保存

标签 .net reflection reflection.emit

我有一些非常简单的代码来生成程序集并在包含的类型上调用方法。该方法被调用并正确运行,但是当我使用反射器查看生成的程序集时,我看不到类型。

下面是示例代码:

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 <Module>
    {
    }
}

谁能帮我正确保存程序集?

最佳答案

诀窍是在 AssemblyBuilder 实例上使用 DefineDynamicModule 方法的“持久模块”版本。也就是说,而不是:

var module = ab.DefineDynamicModule(ab.GetName().Name);

使用类似的东西:
var module = ab.DefineDynamicModule(ab.GetName().Name, ab.GetName().Name + ".mod");

此后相应的模块在保存后出现在程序集中。

关于.net - 程序集未正确保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/193875/

相关文章:

c# - SHGetFileInfo 在没有请求时返回带有覆盖的图标

Java.beans.Introspector.getBeanInfo() 无法分配 writeMethods

scala - 如何在 Scala 2.10.1 中通过反射获取 ctor 参数类型

c# - 从托管代码调用非托管方法

c# - 如何实现一个非随机的随机数生成器?

.net - 非重叠矩形中的 HitTest 算法

c# - 这是定期异步下载的好代码吗?

c# - BindingFlags.DeclaredOnly 替代方法以避免派生类的属性不明确 (AmbiguousMatchException)

c# - IL 通过字符串调用方法

c# - Unity 无法解析动态创建的类的实例