with serialize newtonsoft net c# c++ pinvoke

serialize - Pasar cadenas desde C#a C++ DLL y back-minimal example



string to json c# newtonsoft (1)

No puede pasar una C ++ std::string través de un límite de interoperabilidad. No puede crear uno de esos en su código C #. Entonces tu código nunca puede funcionar.

Necesita utilizar tipos amigables de interoperabilidad en el límite de interoperabilidad. Por ejemplo, matrices de caracteres terminadas en nulo. Eso funciona bien cuando asigna y desasigna la memoria en el mismo módulo. Por lo tanto, es bastante simple al pasar datos de C # a C ++.

C ++

void foo(const char *str) { // do something with str }

DO#

[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(string str); .... foo("bar");

En la otra dirección, normalmente esperaría que la persona que llama a asignar el búfer, en el que puede escribir el llamado:

C ++

void foo(char *str, int len) { // write no more than len characters into str }

DO#

[DllImport("...", CallingConvention = CallingConvention.Cdecl) static extern void foo(StringBuilder str, int len); .... StringBuilder sb = new StringBuilder(10); foo(sb, sb.Capacity);

Estoy intentando hacer el ejemplo mínimo más simple de cómo pasar cadenas hacia y desde una DLL de C ++ en C #.

Mi C ++ se ve así:

using std::string; extern "C" { string concat(string a, string b){ return a + b; } }

Con un encabezado como

using std::string; extern "C" { // Returns a + b __declspec(dllexport) string concat(string a, string b); }

Mi C # es

[DllImport("*****.dll", CallingConvention = CallingConvention.Cdecl)] static extern string concat(string a, string b); }

Y lo estoy llamando con: Console.WriteLine (concat ("a", "b"));

Pero esto da una System.AccessViolationException. Esto parece ser la cosa más trivial para tratar, pero estoy completamente atrapado en eso. Cuando traté de hacer un experimento similar con una función "Agregar" que tomó dos dobles y devolvió una doble, no tuve problemas.