C# プログラムから呼び出すために、外部エクスポートを使用して C++ dll を作成しました。呼び出しはほとんどの関数でうまく機能しますが、C# から C++ にいくつかの文字列を渡す必要がある場合に問題が発生します。
それらを通常の文字列として渡し、const char * として受け取ります。それらはすべて問題なく、すべてのデータがそこにありますが、次に、これらの char 配列からいくつかの文字列を定義します。コードは、関数を終了するまで問題なく続行します。次に、最後に定義された std::string の周りのスタックが破損しているという例外がスローされますが、なぜそうなのかはよくわかりません。文字列を定義する多くの方法を試しました。文字列をコピーしたり、P/Invoke 定義からエンコーディングを変更したりしました。
タイマースレッドからこの関数を呼び出している追加情報。スレッド上の std::string でいくつかの問題が発生する可能性があることを発見したので、これについて言及しています。これは、VS 2012 for x86 でコンパイルされたマルチ CPU マシンで実行されます。また、関連するコードを以下に添付してください
#define OPENCV2P4
#include "openfabmap.hpp"
#include <fstream>
#ifdef OPENCV2P4
#include <opencv2/nonfree/nonfree.hpp>
#endif
#include <stdio.h>
extern "C"
{
__declspec(dllexport) int generateBOWImageDescs( const char* _dataPath, const char* _bowImageDescPath,const char* _vocabPath ,int minWords)
{
std::string dataPath(_dataPath);
std::string bowImageDescPath( _bowImageDescPath);
std::string vocabPath(_vocabPath);
cv::FileStorage fs;
//ensure not overwriting training data
std::ifstream checker;
checker.open(bowImageDescPath.c_str());
if(checker.is_open()) {
checker.close();
return -1;
}
}
そしてC#からの呼び出し
[DllImport(@"FabMap\FabMapCPP.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int generateBOWImageDescs( string _dataPath, string _bowImageDescPath, string _vocabPath, int minWords);
どんな助けでも大歓迎です。ここでも最初の質問なので、質問の間違った表現についてのコメントをいただければ幸いです。
編集:わかりました、問題は $cv::FileStorage fs; にありました。私はそれを本質的に削除し、機能し始めました。不適切な割り当てまたは何かが原因であった可能性があります。
これは、opencv ファイル ストレージが問題を引き起こしていることを意味しますが、その理由はまだわかりません。