7

次の戦略を使用して再帰メソッドのILを生成しようとしました。最初に、次のコードスニペットを使用してタイプを定義しました。

private void InitializeAssembly(string outputFileName)
        {
            AppDomain appDomain = AppDomain.CurrentDomain;
            AssemblyName assemblyName = new AssemblyName(outputFileName);
            assemblyBuilder = appDomain.DefineDynamicAssembly(assemblyName,
                                                              AssemblyBuilderAccess.Save);
            moduleBuilder = assemblyBuilder.DefineDynamicModule(outputFileName, outputFileName + ".exe");
            typeBuilder = moduleBuilder.DefineType(typeName, TypeAttributes.Public);
            methodBuilder = typeBuilder.DefineMethod("Main",
                                    MethodAttributes.Static | MethodAttributes.Public,
                                    typeof(void),
                                    System.Type.EmptyTypes);
            ilGen = methodBuilder.GetILGenerator();

        }

次に、以下のように再帰メソッドのILの生成を開始しました。

MethodBuilder method = typeBuilder.DefineMethod(
                   “MethodName”,
                   MethodAttributes.Static | MethodAttributes.Public,
                   NodeTypeToDotNetType(func.RetType),
                   parameters);
                ILGenerator ilOfMethod = method.GetILGenerator();

method.DefineParameter();

メソッド本体内でメソッド自体を呼び出すために、次の構成を使用しました。

ilOfMethod.Emit(OpCodes.Call, typeBuilder.GetMethod("MethodName", new System.Type[] {typeof(arg1),typeof(arg2),etc}));

最後に、次の方法を使用して、生成されたアセンブリを保存します。

private void SaveAssembly(string outputFileName)
        {
            ilGen.Emit(OpCodes.Ret);
            typeBuilder.CreateType();
            moduleBuilder.CreateGlobalFunctions();
            assemblyBuilder.SetEntryPoint(methodBuilder);
            assemblyBuilder.Save(outputFileName + ".exe");
        }

残念ながら、メソッド内の再帰メソッド呼び出し構文はnullを返すため、これは機能しません。ここでの問題は、メソッド(つまりilOfMethod.Emit(OpCodes.Call, typeBuilder.GetMethod("MethodName", new System.Type[] {typeof(arg1),typeof(arg2),etc})); )内の再帰呼び出しがnullを返すことです。実際にSaveAssembly()メソッド内に型を作成するので、これは許容できます。だから私の質問は次のとおりです:上記の構造を使用して再帰的メソッドのILを生成することは可能ですか?それが不可能な場合は、再帰的メソッドのILを生成するための代替構造を教えてください。

4

1 に答える 1

7

私はそれをテストしていませんが、私が正しく覚えていれば、命令DefineMethodを出すためにの結果を単に使用することができるはずです:Call

MethodBuilder method = typeBuilder.DefineMethod("MethodName", ...);
...

ILGenerator ilOfMethod = method.GetILGenerator();

...
ilOfMethod.Emit(OpCodes.Call, method);
于 2011-06-27T07:37:01.857 に答える