gpt4 book ai didi

c# - StringBuilder 的 PInvoke 访问冲突

转载 作者:太空宇宙 更新时间:2023-11-04 03:27:17 24 4
gpt4 key购买 nike

我目前正在测试一些 PInvoke 东西并编写了一个简短的 C 函数来尝试一些不同的东西。我成功地传递了 Ints 并返回了一个加法,但是在字符串方面我遇到了一些麻烦。

这是 C 函数:

__declspec(dllexport) int test(char *str, int slen){
for(int i = 0; i < slen; i++){
str[i] = 'a';
}
return slen;
}

下面是 C# 函数的声明和用法:

[DllImport("solver.dll", CharSet = CharSet.Ansi ,CallingConvention = CallingConvention.Cdecl)]
public static extern int test(StringBuilder sol, int len);

StringBuilder sol = new StringBuilder(15);
int ret = test(sol, sol.Capacity);
string str = sol.ToString();

我一天中的大部分时间都在研究这个问题,我看到了几篇关于简单地传递 StringBuilder 的帖子,将其填充在 C 端,并且在函数完成时应该可以访问它。但是,我目前在 C 代码中遇到 AccessViolation 错误,就好像没有分配内存一样,但我肯定是用 new StringBuilder(15)

分配了内存

如果我在 C 代码中分配一 block 内存并传递它,C 函数肯定可以工作。有什么我想念的吗?

最佳答案

听起来您缺少以 NUL 结尾的字符串缓冲区。

您可能想像这样更新您的代码:

for (int i = 0; i < (slen-1); i++) {
str[i] = 'a';
}
str[slen-1] = '\0'; // Add a NUL-terminator

请注意,在这种情况下,我假设调用者传递的缓冲区长度是长度,包括 NUL 终止符的空间。

(其他约定也是可能的,例如假设调用者传递的长度不包括 NUL 终止符;重要的是接口(interface)文档的清晰度。)

我还想补充一点,这些导出函数的通常调用约定是 __stdcall 而不是 __cdecl(尽管这与您的问题无关)。

关于c# - StringBuilder 的 PInvoke 访问冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40111767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com