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

时间:2015-05-04 11:08:00

标签: c# .net dll pinvoke marshalling

我尝试从C#-application中调用外部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")的调用会导致错误消息,“无法从'字符串'转换为'sbyte '”*。

2 个答案:

答案 0 :(得分:28)

看起来您将使用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)]

有关使用Windows API函数的大量示例,请参阅pinvoke.net

另见Microsoft's documentation on pinvoking strings

答案 1 :(得分:4)

const char*只是.NET中的string - 管理方(尚未)理解只读参数的概念。

如果您在P / Invoke上下文中使用它,则应声明MarshalAs属性并将其封送为LPStr。结果签名看起来像是

[DllImport("SomeModule.dll")]
public static extern void set_param([MarshalAs(UnmanagedType.LPStr)]string lpString);

还有这个article on MSDN提供了有关如何将本机字符串封送到托管环境的更多信息。