Код C # to C P / IN вызывает несколько объявлений std: string приводит к повреждению стека

Я создал c ++ dll с внешним экспортом, чтобы вызвать его из моей программы на C #. Вызовы работают довольно хорошо для большинства функций, но возникает проблема, когда мне нужно передать некоторые строки из C # в C ++.

Я передаю их как обычную строку и получаю их как const char *. Они все в порядке, и все данные есть, но затем я продолжаю определять пару строк из этих массивов символов. Код продолжается без каких-либо проблем, пока я не выйду из функции. Затем он генерирует исключение, говорящее, что стек вокруг последнего определенного std :: string поврежден, и я действительно не уверен, почему это так. Я перепробовал множество способов определения строк: их копирование, изменение кодировки из определения P / Invoke.

Некоторая дополнительная информация Я вызываю эту функцию из потока таймера; Я упомянул это, как я обнаружил, что некоторые проблемы могут возникнуть с std :: string в потоках. Это делается на машине с несколькими процессорами, скомпилированной в VS 2012 для x86. Также приложив соответствующий код ниже

#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

Решение

Посмотрите на эти 2 ссылки:

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

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

В основном char * — это IntPtr в C #, а не строка.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]