Csharp/C#教程:p /调用从c#调用C dll分享


p /调用从c#调用C dll

这是我的C代码

extern "C" { __declspec(dllexport) void DisplayHelloFromDLL(string a) { printf ("%sn",a) } } 

这是我的C#代码

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

它成功构建但崩溃如下:

调试https://sofzh.miximages.com/c%23/1qr9sj.jpg

那么,如何使用P / invoke从C#调用我自己的C dll? 请提前帮助。

首先,您的代码是C ++而不是C.您的函数接收std::string类型的参数,使用std::string意味着您的代码实际上是C ++。

现在,此参数类型是问题的根源。 您无法在.net中创建std::string ,而是需要使用char*来传递字符串数据。 您需要以下代码:

C ++

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

C#

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

.net string的默认p / invoke编组是将char*作为[In]参数传递。 根据其他答案之一的建议, FreeHGlobal IntPtrStringToHGlobalAnsiFreeHGlobal的复杂性。 如果你可以让p / invoke marshaller完成这项工作,那么最好这样做。

请注意,您还需要确保您的呼叫约定匹配。 假设在构建C ++代码时没有使用任何特殊的编译器选项,该代码将默认使用cdecl调用约定。 您可以将CallingConvention参数与DllImport属性匹配。

请查看MSDN上的编组字符串

在坚果shell中,C#字符串不会被编组为std::string而是默认为char*

一方面,返回类型不匹配。 在C中它是void并且在C# int

将您的C ++ param类型更改为char *并更新您的C#代码,如下所示

上述就是C#学习教程:p /调用从c#调用C dll分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

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

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/950875.html

(0)
上一篇 2021年11月18日
下一篇 2021年11月18日

精彩推荐