1

どのように機能するか試してみたかったのSystem.Reflection.Emitですが、最終的には問題が発生しました。Emit次のような単純なクラスを(を使用して)作成したかったのです。

using System;

namespace emit
{
    class Builder
    {
        private String name;

        public Builder(String builderName)
        {
            name = builderName;
        }

        public override int GetHashCode()
        {
            return name.GetHashCode();
        }

        public override string ToString()
        {
            return this.name;
        }
    }
}

私はいくつかのチュートリアルを経て、動的ライブラリを作成することができました。そのライブラリをディスクに保存し、リフレクションを使用してロードしました。タイプ、コンストラクター、メソッドをフィルタリングできました。また、desired を渡すコンストラクターの呼び出しにも成功しましたstring。それでも、メソッドのいずれかを呼び出そうとすると問題が発生します-System.Reflection.TargetInvocationExceptionがスローされます。

実装方法は次のGetHashCode()とおりです。

MethodBuilder mHashCode = tBuilder.DefineMethod("GetHashCode",
                MethodAttributes.Public | MethodAttributes.HideBySig | MethodAttributes.Virtual,
                CallingConventions.HasThis, typeof(System.Int32), null);
            mHashCode.SetImplementationFlags(MethodImplAttributes.Managed);
            ILGenerator mHashGenerator = mHashCode.GetILGenerator();

            MethodInfo defaultHashCode = typeof(object).GetMethod("GetHashCode");

            mHashGenerator.Emit(OpCodes.Ldfld, simpleName);
            mHashGenerator.Emit(OpCodes.Callvirt, defaultHashCode);
            mHashGenerator.Emit(OpCodes.Ret);

tBuilderTypeBuilder私が作っているということです。

アセンブリを保存して調べるとILDSASM、次のようになります。 ここに画像の説明を入力

そしてEditModule.dllここに画像の説明を入力

残念ながら、このメソッドは呼び出されません。コードは次のとおりです。

                Type dType = asm.GetTypes()[0];
                ConstructorInfo dConstructor = dType.GetConstructor(new Type[] { typeof(string) });
                object dObject = dConstructor.Invoke(new object[] { "Pawel" });
                MethodInfo[] dMethods = dType.GetMethods();
                foreach(var mi in dMethods)
                {
                    Console.WriteLine(mi.Name);
                }
                //method with `0` index is `GetHashCode()`
                dMethods[0].Invoke(dObject, null);

誰かが私が間違っているかもしれないことを知っていますか?

4

1 に答える 1