10

Assembly.GetExecutingAssembly()Assembly.GetCallingAssembly()があります。JITインライン化の動作によっては、あるメソッドが別のメソッドにインライン化される(またはインライン化されない)可能性があるため、さまざまな結果が返される可能性があることに注意しGetCallingAssembly()てください。RemarkGetCallingAssembly()

さて、どうGetExecutingAssembly()違うのですか?JITインライン化は、呼び出すコードを技術的にインライン化できるGetExecutingAssembly()ため、コードは別のアセンブリに属し、それが発生したかどうかに応じて、GetExecutingAssembly()さまざまな結果を生成できます。

GetExecutingAssembly()説明に、説明と同じようにJITの説明に言及するコメントがないのはなぜGetCallingAssembly()ですか?

4

1 に答える 1

16

このメソッドは、同様の方法で実装されているGetExecutingAssemblyため、同じ理由で JIT インライン化の影響を受けません。MethodBase.GetCurrentMethod

どちらのメソッドも、特別な列挙型のローカル変数を宣言し、StackCrawlMarkそれを に初期化しStackCrawlMark.LookForMyCallerます。GetExecutingAssemblyこのローカル変数には、メソッド呼び出しのインライン化を防止するという副作用があり、GetCurrentMethod正しい結果が保証されます。

これは、実験と、SSCLI20 のこの列挙に関連付けられたコメントによってサポートされています。

// declaring a local var of this enum type and passing it by ref 
// into a function that needs to do a stack crawl will both prevent inlining of 
// the calle and pass an ESP point to stack crawl to
//
// Declaring these in EH clauses is illegal; 
// they must declared in the main method body

影響を受けやすい理由GetCallingAssemblyは、呼び出し元の呼び出し元を探しており、ローカル変数は呼び出し元がインライン化されていないことを保証するだけであるためです。つまり、祖父母のメソッドがインライン化されて予期しない結果につながる可能性があります。

于 2012-10-01T08:39:43.890 に答える