4

我构建了一个带有外部导出的 c++ dll,以便从我的 C# 程序中调用它。对于大多数函数,调用都工作得很好,但是当我需要将一些字符串从 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 回答