Построение объектов и вызов методов с использованием IL - PullRequest
0 голосов
/ 05 июня 2011

Я написал следующую программу, чтобы понять конструкцию объекта и вызов метода в IL. К сожалению, она не печатает

Как дела

на консоли.

У вас есть идеи?

Выходные данные peverify также приведены ниже.

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

Microsoft (R) .NET Framework PE Verifier. Версия 4.0.30319.1 Авторские права (c) Корпорация Microsoft. Все права защищены.

Все классы и методы в Research.exe проверен.

C: \ Temp \ Исследования \ Research \ Bin \ Release>

1 Ответ

2 голосов
/ 05 июня 2011

Вы создаете динамическую сборку и ничего не делаете с ней.Почему это должно что-то печатать?Кроме того, peverify здесь вам никак не поможет, поскольку вы не проверяете сгенерированную вами сборку, вы проверяете только сборку, которая ее генерирует., что необходимо, и ваша сборка не может быть запущена.

Если вы используете AssemblyBuilderAccess.RunAndSave и добавляете следующий код в конце метода, он будет работать (по крайней мере, он работаетя):

var barType = typeBuilder.CreateType();
var meMethod = barType.GetMethod("Me", BindingFlags.Static | BindingFlags.NonPublic);
meMethod.Invoke(null, null);
...