当前位置:  开发笔记 > 编程语言 > 正文

装配不能正确保存

如何解决《装配不能正确保存》经验,为你挑选了1个好方法。

我有一些非常简单的代码来生成程序集并在包含的类型上调用方法.该方法被调用并正确运行,但是当我使用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 
    {
    }
}

任何人都可以帮助我正确保存装配?



1> Eric Smith..:

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

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

使用类似的东西:

var module = ab.DefineDynamicModule(ab.GetName().Name, ab.GetName().Name + ".mod");

此后,保存后相应的模块将出现在组件中.

推荐阅读
女女的家_747
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有