既存の C++ 共有ライブラリの周囲に Mono/.Net ラッパー クラスを作成しようとしていますが、アンマネージ コードの実行中に問題が発生しています。ライブラリを正常に呼び出していますが、アンマネージ コードがセグメンテーション エラーをスローしています。これは、C++ で記述されたアンマネージ アプリケーションからライブラリ関数を呼び出した場合には発生しません。
C++ ヘッダー コード:
extern "C" void some_function();
C++ ソース コード:
void some_function()
{
std::vector<uint8_t> v = std::vector<uint8_t> { 0x00 };
}
C# P/Invoke コード:
[DllImport("somelib.so", EntryPoint = "some_function")]
public static extern void some_function();
ご覧のとおり、マーシャリングが必要なパラメーターがないため、渡されるデータに問題はありません。このライブラリのいくつかの関数でこの問題が発生していますが、問題なくいくつかを呼び出すこともできます. 通常、segfault はメモリを割り当てようとしたときに発生しますが (少なくとも 1 つの場合は std::vector の場合)、常にではありません。gdb でデバッグしようとしましたが、C# から呼び出した場合は 5 つのスレッドがあり、C++ から呼び出した場合は 1 つしかないことに気付きました。それが大きな違いを生む場合、私はUbuntuのMonoでもこれを行っています。
P/Invoke 呼び出しを実装しているときに見逃した可能性のあるものはありますか、それともここで何か他のことが起こっていますか?
更新: 最初と同じ問題を抱えている 2 番目のより単純な関数の例を追加しました。
更新: 最初の例を削除し、問題のシンプルかつ完全な実装を提供しました。以前のテストでは、ベクトルを値で初期化していませんでした。ベクトルを初期化する方法をいくつか試しましたが、うまくいきません。初期化中を含め、ベクター内の新しいアイテムにメモリが割り当てられるたびに、セグメンテーション違反が発生するようです。