1

このソリューションを使用して、reflection.emit を使用して匿名型を辞書に変換していました。3.5 から .Net 4.0 に変更するまでは問題なく動作していました。

現在、「System.Security.VerificationException: 操作によりランタイムが不安定になる可能性があります」というメッセージが表示されます。エラー。

匿名で読み込まれた動的メソッドを動的アセンブリでホストされるメソッドに変換して保存し、それに対して peverify.exe を実行して何が問題なのかを調べました。

取得: [IL]: エラー: [DynamicAssemblyExample.dll : MyDynamicType::MyMethod][offs et 0x0000000D][found ref ('this' ptr) 'MyDynamicType'][expected ref '<>f__AnonymousType1`3[System.String, System.Int32,System.Byte]'] スタックに予期しない型があります。[IL]: エラー: [DynamicAssemblyExample.dll : MyDynamicType::MyMethod][offs et 0x0000000D] メソッドが表示されません。2 エラー DynamicAssemblyExample.dll の検証中

コード:

    foreach (PropertyInfo property in itemType.GetProperties(attributes).Where(info => info.CanRead))
    {
        // load Dictionary (prepare for call later)
        methIL.Emit(OpCodes.Ldloc_0);

        // load key, i.e. name of the property
        methIL.Emit(OpCodes.Ldstr, property.Name);

        // load value of property to stack
        methIL.Emit(OpCodes.Ldarg_0);
        methIL.EmitCall(OpCodes.Callvirt, property.GetGetMethod(), null);

        // perform boxing if necessary
        if (property.PropertyType.IsValueType)
        {
            methIL.Emit(OpCodes.Box, property.PropertyType);
        }

        // stack at this point
        // 1. string or null (value)
        // 2. string (key)
        // 3. dictionary

        // ready to call dict.Add(key, value)
        methIL.EmitCall(OpCodes.Callvirt, addMethod, null);

    }

実際のプロパティへのポインタを逆参照する方法はありますか? それとも、どういうわけかキャストする必要がありますか?ポインタはありますか?

よろしく!

4

2 に答える 2

0

ただの提案ですが、実際に辞書に書き込むためにILを発行するコードを書き直そうとしましたか?つまり、できませんReflection.Emitか?私の賭けは、匿名タイプにアクセスするコードではなく、生成されたILが何らかの形で適切ではないということです。

于 2010-07-06T00:54:56.463 に答える
0

申し訳ありませんが、間違いを犯しました。実際の動的メソッドは、匿名 (または非匿名) 型のインスタンスに作用するデリゲート型を作成するため、Ldarg_0 コードは、このデバッグ実装には存在しないものを探しています。

だから私はそれを OpCodes.Ldnull に変更しました。

           var attributes = BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy;
        foreach (PropertyInfo property in itemType.GetProperties(attributes).Where(info => info.CanRead))
        {
            // load Dictionary (prepare for call later)
            methIL.Emit(OpCodes.Ldloc_0);

            // load key, i.e. name of the property
            methIL.Emit(OpCodes.Ldstr, property.Name);

            // load value of property to stack
            methIL.Emit(OpCodes.Ldnull);

            //methIL.Emit(OpCodes.Castclass, itemType);
            methIL.EmitCall(OpCodes.Callvirt, property.GetGetMethod(), null);

            // perform boxing if necessary
            if (property.PropertyType.IsValueType)
            {
                methIL.Emit(OpCodes.Box, property.PropertyType);
            }

            // stack at this point
            // 1. string or null (value)
            // 2. string (key)
            // 3. dictionary

            // ready to call dict.Add(key, value)
            methIL.EmitCall(OpCodes.Callvirt, addMethod, null);

        }

しかし、検証した後も、メソッドが表示されないというエラーが表示されます。匿名型のプロパティの get メソッドがリフレクション経由で表示されないということですか?

于 2010-07-06T00:41:56.323 に答える