我构建了一个带有外部导出的 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文件存储导致问题,仍然不知道为什么。