whats novedades new features espaƱol compute c# c++ dll

novedades - std:: string en C#?



new features c# (4)

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);

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.


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.


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);


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.