如何将const char *从C#传递给C函数?
我尝试从我的C#-application中调用来自外部DLL的普通C函数。 此function定义为
void set_param(const char *data)
现在我使用这个函数有一些问题:
-
如何在C#代码中指定此“const”?
public static extern void set_param(sbyte *data)
似乎错过了“const”部分。 -
调用此函数时,如何移交普通的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 marshaller处理字符串的复制并将数据转换为适合您的类型。
如果堆栈不平衡时出错,则需要设置调用约定以匹配C DLL,例如:
[DllImport("yourdll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
有关使用Windows API函数的大量示例,请参阅pinvoke.net 。
另请参阅Microsoft关于pinvoking字符串的文档 。
const char*
只是.NET中的一个string
– 管理方(尚未)理解只读参数的概念。
如果您在P / Invoke上下文中使用它,则应声明MarshalAs
属性并将其编组为LPStr
。 由此产生的签名看起来像是一条线
[DllImport("SomeModule.dll")] public static extern void set_param([MarshalAs(UnmanagedType.LPStr)]string lpString);
MSDN上还有这篇文章,其中提供了有关如何将本机字符串封送到托管环境的更多信息。