2

ここでセシルの質問を見てみましたが、この特定の質問に関しては何も見ていません。

私が達成しようとしmethod.Body.Variablesているのは、特定のタイプの変数を見つけることです(System.Exception私の場合)

私はそれがうまくいくと思って次のコードを書きました:

var exceptionTypeReference = module.Import(typeof(Exception));
var exceptionVariable = method.Body.Variables.First(x => x.VariableType == exceptionTypeReference);

理由はcecilの初心者であると確信していますが、実行時に「シーケンスに一致する要素が含まれていません」というエラーが表示されるため、私には奇妙に思えます。

私はコードをステップ実行しましたが、そこに変数があり、そのタイプが であることはわかっていますが、 とSystem.Exception一致したくありませんexceptionTypeReference

これは単純なことであり、私の脳はセシルを学ぶことで揚げられていると確信しています. それでも、指差し、濡れた魚で顔を叩くなど、大歓迎です。

4

1 に答える 1

4

タイプをインポートするたびに、それは別のインスタンスになりますTypeReference

したがって、この

var typeReference1 = moduleDefinition.Import(typeof (Exception));
var typeReference2 = moduleDefinition.Import(typeof (Exception));
Debug.WriteLine(typeReference1 == typeReference2);

を出力しますfalse

したがって、クエリを実行しているとき

  • VariableTypeTypeReferenceを表すインスタンスである可能性がありますException
  • exceptionTypeReferenceTypeReferenceを表すインスタンスになりますException

しかし、それらは同じ参照ではなく、組み込みの等価性チェックはありませんTypeReference

あなたがする必要があるのは

var exceptionType = module.Import(typeof(Exception));
var exceptionVariable = method
              .Body
              .Variables
              .First(x => x.VariableType.FullName == exceptionType.FullName);

また、継承された例外タイプを処理する必要があることも覚えておいてください。

側面として注意しないで.Import(typeof (Exception))ください。その理由は、ターゲット アセンブリの Exception 型ではなく、現在のコードの Exception 型を提供するためです。たとえば、.net4 アセンブリを使用して WinRT アセンブリを処理できます。.net4 例外タイプをインポートすると、おそらく奇妙な動作が発生します。

したがって、これを行うのと同じくらい安全です

var exceptionVariable = method
                   .Body
                   .Variables
                   .First(x => x.VariableType.FullName == "System.Exception");
于 2013-01-05T09:57:24.933 に答える