0

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 検証ツール。バージョン 4.0.30319.1 Copyright (c) Microsoft Corporation. 全著作権所有。

Research.exe のすべてのクラスとメソッドが検証済みです。

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

4

1 に答える 1

2

動的アセンブリを作成した後、何もしません。なぜそれが何かを印刷する必要があるのですか?また、生成したアセンブリを検証しているのではなく、それを生成しているアセンブリのみを検証しているため、ここでは peverify は何の役にも立ちません。

typeBuilder.CreateType()これは必要であり、アセンブリは実行できるように設定されていません。

メソッドの最後に次のコードを使用AssemblyBuilderAccess.RunAndSaveして追加すると、機能します(少なくとも私にとっては機能します)。

var barType = typeBuilder.CreateType();
var meMethod = barType.GetMethod("Me", BindingFlags.Static | BindingFlags.NonPublic);
meMethod.Invoke(null, null);
于 2011-06-05T13:45:25.173 に答える