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.