4

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 ファイル ストレージが問題を引き起こしていることを意味しますが、その理由はまだわかりません。

4

1 に答える 1

-1

この2つのリンクを見てください:

http://support.microsoft.com/kb/311259

http://msdn.microsoft.com/en-us/library/7b620dhe.aspx

基本的に char* は C# の IntPtr であり、文字列ではありません。

于 2012-11-05T21:50:38.223 に答える