6

Mono.Cecilを使用すると、 System.Collections.Generic.List( _items_size、など)のフィールドを反復処理できますが_version、それらを使用しようとすると常に例外が発生します。

メンバー 'T[] System.Collections.Generic.List`1::_items' は別のモジュールで宣言されており、インポートする必要があります

これに関して 2 つの質問があります。

  1. ジェネリックの基礎となるフィールドにアクセスすることはできませんか?
  2. 可能であれば、インポート ステートメントはどのようになりますか?

オブジェクトのプライベート メンバーへのアクセスに成功したので (コンパイラによって生成されたものでない限り)、(1) は問題ないと思います。インポートも成功しましたが、インポートがどのように機能するかについての理解が不安定であることは認めます (別名、「エラーが発生した場合は、インポートしてみてください」)。

4

1 に答える 1

3

FieldDefinition を指す IL を書き込む前に、FieldDefinition を ModuleDefinition にインポートする必要があります。

したがって、コードを見ると、次のようになります。

var fieldReference = ModuleDefinition.Import(field);
Action<Collection<Instruction>> load = collection => collection.AddI(OpCodes.Ldfld, fieldReference);

また、別のバグがあることにも注意してください。上記のコードに入る頃には、型引数のコンテキストが失われています。List<T>したがって、のようなものではなく、何かを呼び出そうとしていますList<MyClass>。しかし、その質問を解決できない場合は、別のSO質問を提起できます:)

于 2013-05-01T10:50:09.633 に答える