以固定大小的 char[] 作为输入的 PInvoke 方法

问题描述 投票:0回答:1

我有一个具有以下签名的第三方库:

int GetError(char *Message, int Length)

这里的消息必须是至少大小为 Length 的缓冲区,否则函数将失败。 PInvoke 这个怎么办?我已经尝试使用 Stringbuilder 来获取消息,但在这里我无法指定长度并且函数失败。

Message 参数被声明为函数的输入参数。

c# pinvoke
1个回答
4
投票

这是一个例行场景。您要求被调用者填充调用者分配的缓冲区。这是

StringBuilder
的领域。

p/invoke 声明将是:

[DllImport(dllname, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.???)]
public static extern int GetError(StringBuilder message, int length);

您想必知道调用约定是什么,并且可以填写它。

然后您可以像这样调用该函数:

StringBuilder message = new StringBuilder(256);
int retval = GetError(message, message.Capacity);
// check retval for error conditions
string error = message.ToString();

注意 CA1838:避免 P/Invokes 的 StringBuilder 参数

© www.soinside.com 2019 - 2024. All rights reserved.