如何从 C# 将 const char* 传递给 C 函数?
How do I pass a const char* to a C function from C#?
我尝试从我的 C# 应用程序中的外部 DLL 调用纯 C 函数。此函数定义为
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")
会导致错误消息 "cannot convert from 'string' to '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)]
有关使用 Windows API 函数的大量示例,请参阅 pinvoke.net。
A 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,其中包含有关如何将本机字符串编组到托管环境的更多信息。
我尝试从我的 C# 应用程序中的外部 DLL 调用纯 C 函数。此函数定义为
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")
会导致错误消息 "cannot convert from 'string' to '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)]
有关使用 Windows API 函数的大量示例,请参阅 pinvoke.net。
A 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,其中包含有关如何将本机字符串编组到托管环境的更多信息。