2012-02-24 6 views
4

私はMono.Cecilを使用して、次のILを再現しようとしている:Mono.CecilでMethodReferenceのGenericParameter戻り値の型を作成する方法は?

call !!0 [mscorlib]System.Threading.Interlocked::CompareExchange<class [System]System.ComponentModel.PropertyChangedEventHandler>(!!0&, !!0, !!0) 

私はこのILを検査するMono.Cecilを使用する場合、私は命令のオペランドがElementMethodを保持しているGenericInstanceMethod、であることがわかりMethodReference型の。このMethodReferenceには、GenericParameter型の戻り値型があります。

同じオブジェクトを手動で作成したいと思っていますが、キャッチ22に達するようです。 GenericParameterを作成するには、上記のMethodReferenceと同じようなIGenericParameterOwnerが必要です。だから、MethodReferenceをGenericParameterコンストラクタに渡したいと思います。しかし、私は、GenericParameterでなければならないと仮定して、戻り値の型のTypeReferenceを持たないMethodReferenceを作成することはできません。

どうすれば解決できますか?私は何を誤解していますか?

答えて

4

これはAPIの問題であるようです。

これを回避する簡単な方法は、TypeReferenceをMethodReferenceのReturnTypeとしてvoidに渡し、ReturnTypeを後で作成されたGenericParameterに変更することです。

+0

ああ、このようなことができますか? 'var elementMethodRef = new MethodReference(" CompareExchange "、_voidTypeRef); var genParam = new GenericParameter( "!! 0"、elementMethodRef); elementMethodRef.ReturnType = genParam; ' – Einar

+0

@Einarはい、次にelementMethodRef.GenericParameters.Add(genParam); –

+0

素敵な、それは欠けている部分だった!ありがとう! – Einar

関連する問題