gpt4 book ai didi

c# - p/invoke 从 c# 调用 C dll

转载 作者:太空宇宙 更新时间:2023-11-04 05:44:39 25 4
gpt4 key购买 nike

这是我的C代码

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

这是我的C#代码

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

static void Main ()
{
string a = "Hello";
DisplayHelloFromDLL(a);
}
}

它构建成功但像这样崩溃:

Debug

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

最佳答案

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

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

C++

__declspec(dllexport) void DisplayHelloFromDLL(char* a)
{
printf("%s\n", 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] 参数传递。不需要其他答案之一所建议的 IntPtrStringToHGlobalAnsiFreeHGlobal 的复杂性。如果您可以让 p/invoke 编码器完成工作,那么最好这样做。

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

关于c# - p/invoke 从 c# 调用 C dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8891528/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com