C#到C代码P/调用多个std:字符串声明导致堆栈损坏

C# to C code P/INvoke multiple std:string declarations lead to stack corruption

本文关键字:声明 字符串 损坏 堆栈 std 代码 调用      更新时间:2023-10-16

我构建了一个用外部导出的C DLL,以便从我的C#程序中调用它。调用对大多数功能都非常有效,但是当我需要将一些字符串从C#传递到C 时,存在问题。

我将它们作为正常字符串传递,并以const char *接收。它们都很好,所有数据都在那里,但是后来我继续定义了几个字符串,从这些字符阵列中进行了几个字符串。代码继续没有任何问题,直到i退出函数为止。然后,它引发了一个例外,说最后一个定义的std :: string周围的堆栈已损坏,我真的不确定为什么是这种情况。我尝试了许多定义字符串的方法:复制它们,将编码从P/Invoke定义更改。

我正在从计时器线程中调用此功能的一些额外信息;正如我发现的那样,我提到的是,线程上的std :: string可能会出现一些问题。这是在X86中与2012年编辑的多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(@"FabMapFabMapCPP.dll", CallingConvention = CallingConvention.Cdecl)]
         public static extern int generateBOWImageDescs( string _dataPath, string    _bowImageDescPath, string _vocabPath, int minWords);

任何帮助将不胜感激。这里也是这里的第一个问题,因此对问题的错误介绍的任何评论都将不胜感激。

编辑:好的,事实上,问题是$ cv :: filestorage fs;我从本质上删除了它,并且它开始工作,可能是由于分配不当或其他原因。

因此,这意味着OpenCV文件存储正在引起问题,但仍不确定为什么。

请查看此两个链接:

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

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

基本上是char*是c#中的intptr,而不是字符串。