p / invoquer l’appelant dll depuis c #

c‘est mon code C

extern "C" { __declspec(dllexport) void DisplayHelloFromDLL(ssortingng a) { printf ("%s\n",a) } } 

c’est mon code C #

 class HelloWorld { [DllImport("TestLib.dll")] public static extern void DisplayHelloFromDLL(ssortingng a); static void Main () { ssortingng a = "Hello"; DisplayHelloFromDLL(a); } } 

Il a construit avec succès mais plantage comme ceci:

Déboguer http://soffr.miximages.com/c%23/1qr9sj.jpg

SO, comment utiliser P / invoke pour appeler ma propre dll C depuis C #? S’il vous plaît aider, merci d’avance.

Tout d’abord votre code est C ++ plutôt que C. Votre fonction reçoit un paramètre de type std::ssortingng et l’utilisation de std::ssortingng signifie que votre code est en réalité C ++.

Maintenant, ce type de paramètre est la racine de votre problème. Vous ne pouvez pas créer un std::ssortingng dans .net, mais vous devrez utiliser un caractère char* pour transmettre les données de la chaîne. Le code suivant est ce dont vous avez besoin:

C ++

 __declspec(dllexport) void DisplayHelloFromDLL(char* a) { printf("%s\n", a); } 

C #

 [DllImport("TestLib.dll", CallingConvention = CallingConvention.Cdecl)] public static extern void DisplayHelloFromDLL(ssortingng a); static void Main () { ssortingng a = "Hello"; DisplayHelloFromDLL(a); } 

Le marshalling p / invoke par défaut pour une ssortingng .net consiste à transmettre un caractère char* comme paramètre [In] . La complexité de IntPtr , SsortingngToHGlobalAnsi , FreeHGlobal n’est pas nécessaire, comme le suggère l’une des autres réponses. Si vous pouvez laisser le marshaller p / invoke faire le travail, il est préférable de le faire.

Notez que vous devez également vous assurer que vos conventions d’appel correspondent. En supposant que vous n’ayez utilisé aucune option spéciale du compilateur lors de la construction de votre code C ++, ce code utilisera par défaut la convention d’appel cdecl utilisée. Vous pouvez faire correspondre ce paramètre avec le paramètre CallingConvention à l’atsortingbut DllImport .

S’il vous plaît jeter un oeil à marshalling ssortingng chez MSDN

En un mot, une chaîne C # n’est pas organisée en tant que std::ssortingng mais un caractère char* par défaut

D’une part, le type de retour ne correspond pas. En C c’est void et en C # int .

Changez votre type de paramètre C ++ en char * et mettez à jour votre code C # comme suit

 class HelloWorld { [DllImport("TestLib.dll")] public static extern void DisplayHelloFromDLL(IntPtr a); static void Main () { ssortingng a = "Hello"; var ptr = System.Runtime.Marshal.SsortingngToHGlobalAnsi(a); DisplayHelloFromDLL(ptr); System.Runtime.Marshal.FreeHGlobal(ptr); } }