C# では、次のステートメントを検討してください。
string operation = new StackTrace(false).GetFrame(0).GetMethod().Name;
フレームがネイティブ コードにコンパイルされる可能性があるリリース ビルドでは、これは危険な構造ですか?
いいえ、言うまでもなく危険ではありませんが、デバッグシンボルなしでビルドされたリリースビルドから必要なすべての情報を取得できない場合があります。これがMSDNからのいくつかの情報です:
StackTrace情報は、デバッグビルド構成で最も有益です。デフォルトでは、デバッグビルドにはデバッグシンボルが含まれていますが、リリースビルドには含まれていません。デバッグシンボルには、StackFrameオブジェクトとStackTraceオブジェクトの作成に使用されるほとんどのファイル、メソッド名、行番号、および列情報が含まれています。
CLR は、スタック ウォークについて非常に強力な保証を提供します。必然的に、ガベージ コレクターとコード アクセス セキュリティを機能させるために非常に重要です。ただし、信頼できないのは、GetFrame(0) がメソッドのスタック フレームを提供することです。コードのインライン化は、重要なジッタ最適化です。少なくとも [MethodImpl] で最適化を明示的に抑制せずに、メソッドに MethodImplOptions.NoInlining を指定します。
スタック ウォークと最適化の抑制はどちらもコストがかかるため、このコードがクリティカル パスにないことを確認してください。
この機能のコンパイラ サポートは、 [CallerMemberName] 属性を使用して、C# の次のバージョンであるバージョン 5 に追加されます。
AFAIKいいえ。
とにかく、すべてがILにコンパイルされます。リリース ビルドを行う場合でも、必要なのは pdb ファイルだけです。
これは、プロジェクト プロパティの詳細オプションで設定できます
返信ありがとうございます。
私の問題は、リストされたステートメント (アクセス違反) を含むコードで散発的なクラッシュが発生したことですが、ステートメントがなくてもコードは安定しています。しかし、返信のために、私は他のものを見なければならないようです.