std :: string en C #?

Pensé que el problema estaba dentro de mi función C ++, pero probé esto

Función C ++ en C ++ dll:

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

C # code:

 [DllImport("pk2.dll")] public static extern bool OpenA(string path); if (OpenA(@"E:\asdasd\")) 

Recibo una excepción que dice que la memoria está corrupta, ¿por qué?

Si elimino el parámetro std :: string, funciona bien, pero con std :: string no funciona.

std :: string y c # string no son compatibles entre sí. Hasta donde sé, la cadena c # corresponde al pasar char* o wchar_t* en c ++ en lo que se refiere a interoperabilidad.
Una de las razones para esto es que puede haber muchas implementaciones diferentes para std :: string y c # no puede suponer que está utilizando ninguna en particular.

Pruebe algo como esto:

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

También debe especificar el conjunto de caracteres apropiado (unicode / ansi) en su atributo DllImport.

Por otro lado, sin relación con su problema de clasificación, uno normalmente pasaría una cadena std: como referencia constante: const std: string & filename.

No es posible ordenar una C ++ std :: string de la forma en que lo intentas. Lo que realmente necesita hacer aquí es escribir una función de envoltura que use un simple const char* y se convierta en std :: string debajo del capó.

C ++

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

DO#

 [DllImport("pk2.dll")] public static extern void OpenWrapper( [In] string name); 

Sé que este tema es un poco viejo, pero para los futuros usuarios de Google, esto también debería funcionar (sin usar char * en C ++)

DO#:

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

C ++:

 bool __declspec( dllexport ) OpenA(std::string file);