最近、モノランタイムを特定のアプリに統合しており、Debug
構成を使用してほとんどのテストを行っていました。最近、に切り替えたところRelease
、クラッシュし始めたことに気付きました。(msvs2010 コンパイラを使用しています)。
追跡したところ、 経由で取得した関数ポインタを呼び出すときに発生していることがわかりましたmono_method_get_unmanaged_thunk
。それを引き起こした構成の違いの 1 つは/O2
、リリース/Od
とデバッグでの最適化でした。私が観察したところ、マネージ メソッドが終了した直後にクラッシュが発生しました。これらの最適化に関する既知の考慮事項はありますか?
私のシナリオは次のとおりです。
ネイティブ コードでは、マネージド ランドにジャンプするための関数ポインターを取得しています。
bool (*Some_Method) (MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**);
マネージド側では、メソッドは非静的メソッドであるため、最初の引数はthis
次のとおりです。
bool Managed_Method(int, SomeType a2, SomeType a3, SomeType a4)
ネイティブ側を初期化している間、私はそのようなポインターをフェッチしています:
Some_Method = (bool(*)(MonoObject*, int, MonoObject*, MonoObject*, MonoObject*, MonoException**)) mono_method_get_unmanaged_thunk(method)
そして、取得したポインターを使用してマネージド メソッドを呼び出しています。
bool result = Some_Method(v, o1, o2, o3)
ここで、o1、o2、o3 は null または有効な管理対象オブジェクトです。
メソッドの本体は実際には何もしません。現在のシナリオでは、1 つのブール値チェックを実行した後、false のままになります。
モノランタイム:2.10.8