首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用IL构造对象和调用方法

使用IL构造对象和调用方法
EN

Stack Overflow用户
提问于 2011-06-05 11:45:56
回答 1查看 178关注 0票数 0

我编写了下面的程序,以便理解IL中的对象构造和方法调用,不幸的是它没有打印

,你好吗?

在控制台上。

你有什么想法吗?

下面也给出了peverify的输出。

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection.Emit;
using System.Reflection;
using System.IO;

namespace Research
{
    public class Program
    {
        public static void Main(string[] args)
        {
            AssemblyName name = 
                new AssemblyName(Path.GetFileNameWithoutExtension("Hello"));
            AssemblyBuilder asmb = 
                System.AppDomain.CurrentDomain.DefineDynamicAssembly(name, 
                                                    AssemblyBuilderAccess.Save);
            ModuleBuilder modb = asmb.DefineDynamicModule("Hello");
            TypeBuilder typeBuilder = modb.DefineType("Bar");
            MethodBuilder methb = 
                typeBuilder.DefineMethod("Me", MethodAttributes.Static, 
                                            typeof(void), System.Type.EmptyTypes);
            ILGenerator gen = methb.GetILGenerator();

            ConstructorInfo cil = typeof(Research.Dog).GetConstructor(new Type[] { });
            gen.Emit(OpCodes.Newobj, cil);
            gen.Emit(OpCodes.Call, typeof(Research.Dog).GetMethod("Bark"));
            gen.Emit(OpCodes.Ret);
        }
    }
    public class Dog
    {
        public void Bark()
        {
            Console.WriteLine("How are you doing");
        }
    }
}

C:\temp\Research\Research\bin\Release>peverify

Research.exe

微软(R) .NET框架PE验证器。版本4.0.30319.1版权(c)微软公司。版权所有。

Research.exe中的所有类和方法都得到了验证。

C:\temp\Research\Research\bin\Release>

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-05 13:45:25

您创建一个动态程序集,然后对它不做任何操作。为什么要打印任何东西?此外,在这里,generated对您没有任何帮助,因为您不是在验证您生成的程序集,而是只验证生成它的程序集。

您也不调用typeBuilder.CreateType(),这是必要的,而且程序集设置为无法运行。

如果您使用AssemblyBuilderAccess.RunAndSave并在方法的末尾添加以下代码,它将工作(至少对我有效):

代码语言:javascript
复制
var barType = typeBuilder.CreateType();
var meMethod = barType.GetMethod("Me", BindingFlags.Static | BindingFlags.NonPublic);
meMethod.Invoke(null, null);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6242698

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档