Я создал 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, но до сих пор не уверен, почему
Посмотрите на эти 2 ссылки:
http://support.microsoft.com/kb/311259
http://msdn.microsoft.com/en-us/library/7b620dhe.aspx
В основном char * — это IntPtr в C #, а не строка.
Других решений пока нет …