1

興味深い問題が発生しており、誰かが光を当てることができるのではないかと思います。現在、警告が表示"Method never reaches end or 'return' statement"されています: イベント ハンドラー デリゲート コールバックで、かなり奇妙です。

SCB_次のコードを検討してください (関数は無視できます。質問には関係ありません)。

public static class NativeBridge
{
    private static UnityEventQueue _eventQueue;
    private static bool _initialized;

    public static void Init() 
    {
        if (_initialized)
        {
            return;
        }
        _initialized = true;
        SCB_SDKInit();
        _eventQueue = UnityEventQueue.Instance;
        _eventQueue.AppExiting += EventQueue_AppExiting;
        SCB_registerReceivedSistrCallback(SistrReceived);
    }

    //Lots of other irrelevant code

    private static void EventQueue_AppExiting(object sender, EventArgs e)
    {
        SCB_registerReceivedSistrCallback(null);
        _eventQueue.AppExiting -= EventQueue_AppExiting;
        SCB_SDKFinal();
        _initialized = false;
    }

}

警告がオンになっていEventQueue_AppExitingます。ここが奇妙な部分です。登録解除をコメントアウトすると_eventQueue.AppExiting -= EventQueue_AppExiting、警告が消えます。

コンパイラの到達不能パスのバグのように見えるものに対して、さまざまな「解決策」を試しました。

  1. 静的クラスを非静的にし、それに応じて調整します
  2. を静的にし、それに応じて調整eventしますUnityEngineQueue
  3. コールバック メソッドの最後に登録解除イベントを配置します。
  4. void SCB_関数の呼び出しをサニティ チェックにコメント アウトします。
  5. その他のさまざまなSpaghetti at the wallソリューション

上記のすべてで、コンパイラの動作に変化はありませんでした。私たちの最善の推測は、コンパイラーが登録解除を検出し、デリゲートが削除されているため、実行時に実行を完了できないと考えていることです。ただし、呼び出しが既に開始されているため、スタックは削除後も実行を継続する必要があると思います。

これがアプリケーションの実行に悪影響を及ぼしているようには見えませんが、イベントの呼び出し条件 (アプリケーションの終了) の性質上、デバッグが困難です。

コンパイラは何を見ているのでしょうか、そして/または私たちが間違っている可能性があるのは何ですか?

P.S. コンテキストを少し説明すると、このクラスは、同様の API を使用してさまざまなプラットフォーム固有のライブラリへstaticのブリッジとして機能するためです。externしかし、その事実は質問とはほとんど関係がなく、「EWWWW 静的クラス」の感情を鎮めるためのものです。

4

1 に答える 1

0

このリンクで報告されているバグだと思います:

https://bugzilla.xamarin.com/show_bug.cgi?id=42819

そしてここ

https://bugzilla.xamarin.com/show_bug.cgi?id=41798

バージョン 6.2.0.259 で修正済みと報告されています。

于 2016-08-18T07:37:23.483 に答える