2

次のコードを想定します

private AutoResetEvent m_MethodDone = new AutoResetEvent(false);

private void Method1()
{
    // Do something
    Method2();
}

private void Method2()
{
    // All done
    m_MethodDone.Set();
}

private void Method3()
{
}

private void Program()
{
    Task t = New Task(() => { // Code In Question
        m_MethodDone.WaitOne()
        Method3();
    });

    t.Start();
    // Do other things.
}

質問

CLR イベントを "キャプチャ" する方法はありますか?それは、イベントやスレッドのループからのものですか?

if(SomeRunTimeThing.LastMethodExecuted.Name == "Method2")
     Method3();

どうして

ソフトウェアの根幹に呼び出しフックを書き込む必要はありません。これは観察可能な問題です (うーん、アイデアが来ています...) (実際には、自動化タイプの機能の UI 呼び出しパターンを観察します)。

4

3 に答える 3

2

私の知る限り、このシナリオは CLR ではサポートされていません。

もしそうなら、これはあらゆる種類の合併症につながります。たとえば、コンパイラはプライベート メソッドをインライン化する可能性があるため、実際のコードは次のようになります。

private void Method1()
{
    // Body of Method 1
    // Body of Method 2
}

その場合SomeRunTimeThing.LastMethodExecuted.Name、決して値を取らないMethod2。(これが、ロギングとデバッグ以外の目的でスタック トレース情報を使用してはならない理由でもあります。)

于 2013-02-04T14:30:17.750 に答える
1

私が理解していれば、メソッドのコードを変更せずに最後に呼び出されたメソッドを特定する必要があります。1 つの解決策が思い浮かびます: socope のすべてのクラスに傍受を使用します。そして、傍受コードでは、どのメソッドが呼び出されたかを保存します。

たとえば、ユニティを使用できるUPDについては、http: //msdn.microsoft.com/en-us/library/ff660861%28v=pandp.20%29.aspxを参照してください。

于 2013-02-04T14:31:44.320 に答える
0

事後にどの呼び出しが行われたかを追跡する簡単な方法はありませんが、どのメソッドが特定のメソッドを呼び出したかを確認できます。おそらく、コール スタックを使用して問題を解決できます。例については、 http://www.csharp-examples.net/reflection-callstack/を参照してください。

于 2013-02-04T14:39:09.870 に答える