c# - 如何从 C# 将 const char* 传递给 C 函数?

标签 c# .net dll pinvoke marshalling

我尝试从我的 C# 应用程序中的外部 DLL 调用纯 C 函数。此函数定义为

void set_param(const char *data)

现在我在使用这个函数时遇到了一些问题:

  1. 如何在 C# 代码中指定这个“const”? public static extern void set_param(sbyte *data) 似乎遗漏了“const”部分。

  2. 调用此函数时,如何传递普通的 8 位 C 字符串?调用 set_param("127.0.0.1") 会导致错误消息,“无法从‘string’转换为‘sbyte’”*。

最佳答案

看起来您将使用 ANSI 字符集,因此您可以像这样声明 P/Invoke:

[DllImport("yourdll.dll", CharSet = CharSet.Ansi)]
public static extern void set_param([MarshalAs(UnmanagedType.LPStr)] string lpString);

.NET 编码器处理复制字符串并将数据转换为适合您的类型。

如果出现堆栈不平衡的错误,则需要设置调用约定以匹配您的 C DLL,例如:

[DllImport("yourdll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]

参见 pinvoke.net有很多使用 Windows API 函数的示例。

另见 Microsoft's documentation on pinvoking strings .

关于c# - 如何从 C# 将 const char* 传递给 C 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30028593/

相关文章:

c# - 获取没有文本框的文本输入

java - Java 中的 OpenCV,为什么我不能使用 Mat.CvType.CV_8UC1?

c# - 使用 sql 查询将值插入 sql 数据库

c# - 如何在 RichTextBox C# 中显示行数

c# - 谁能给我看一个 MethodImplOptions.ForwardRef 的例子

c# - 是否可以在命令行或通过配置文件添加 "InternalsVisibleTo"的包?

c# - 在 VBScript 中使用 DLL

c - 如何编译需要其他dll的dll

c# - Mailbridge 非 SSL 到 SSL 服务器

c# - 如何确定何时显示工具提示?