std :: string в C #? - PullRequest
       29

std :: string в C #?

8 голосов
/ 17 мая 2009

Я думал, что проблема в моей функции C ++, но я попробовал это

C ++ Функция в C ++ dll:

bool __declspec( dllexport ) OpenA(std::string file)
{
return true;
}

C # код:

[DllImport("pk2.dll")]
public static extern bool OpenA(string path);

    if (OpenA(@"E:\asdasd\"))

Я получаю исключение, что память повреждена, почему?

Если я удаляю параметр std :: string, он прекрасно работает, но с std :: string он не работает.

Ответы [ 5 ]

14 голосов
/ 17 мая 2009

std :: string и c # string не совместимы друг с другом. Насколько я знаю, строка c # соответствует передаче char* или wchar_t* в c ++ в части взаимодействия.
Одна из причин этого заключается в том, что в std :: string может быть много разных реализаций, и c # не может предполагать, что вы используете какой-то конкретный вариант.

7 голосов
/ 17 мая 2009

Попробуйте что-то вроде этого:

bool __declspec( dllexport ) OpenA(const TCHAR* pFile)
{ 
   std::string filename(pFile);
   ...
   return true;
}

Вы также должны указать соответствующий набор символов (unicode / ansi) в атрибуте DllImport.

Помимо этого, независимо от вашей проблемы с маршалингом, обычно передается std: string как ссылка на const: const std: string & filename.

1 голос
/ 17 мая 2009

Невозможно упорядочить C ++ std :: string так, как вы пытаетесь. Здесь вам действительно нужно написать функцию-обертку, которая использует простой старый const char* и преобразует в std :: string под капотом.

C ++

extern C { 
  void OpenWrapper(const WCHAR* pName) {
    std::string name = pName;
    OpenA(name);
  }
}

C #

[DllImport("pk2.dll")]
public static extern void OpenWrapper( [In] string name);
0 голосов
/ 28 марта 2019

std :: wstring и System.string могут быть совместимы с помощью преобразования ниже:

C ++:

bool func(std::wstring str, int number)
{
  BSTR tmp_str = SysAllocStringLen(str.c_str(), str.size());
  VARIANT_BOOL ret = VARIANT_FALSE;

  // call c# COM DLL
  ptr->my_com_function(tmp_str, number, &ret);

  SysFreeString(tmp_str);

  return (ret != VARIANT_FALSE) ? true : false;
}
0 голосов
/ 12 декабря 2013

Я знаю, что эта тема немного устарела, но для будущих гуглеров это тоже должно работать (без использования char * в C ++)

C #:

public static extern bool OpenA([In, MarshalAs(UnmanagedType.LPStr)] path);

C ++:

bool __declspec( dllexport ) OpenA(std::string file);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...