gpt4 book ai didi

c# - C# AccessViolation/Marshalling 中的 native C-DLL

转载 作者:太空宇宙 更新时间:2023-11-04 07:31:59 25 4
gpt4 key购买 nike

我在从 C# 调用 C DLL 时遇到问题

C 函数是(我没有 c 头文件或一个很好的规范:( )

int knr12_read ( char *kn12, char *ik9, char *wok, char *wlc,
char *plz, char *ort, char *woz );

kn12 是一个 ref 参数

这是我在 C# 中尝试过的

 [return: MarshalAs(UnmanagedType.U4)]
[DllImport("Knr12.dll", CallingConvention = CallingConvention.StdCall, EntryPoint = "knr12_read", CharSet = CharSet.Ansi)]
unsafe public static extern int knr12_read(out IntPtr buffer, string ik9, string wok, string wlc, string plz, string ort, string woz);

int knr = knr12_read(out pBuffer, knrTemp, "11111", "", "98529", "Suhl", "1");

string data = Marshal.PtrToStringAnsi(pBuffer);

返回的 int 总是正确的,它应该如何,但我对 ref 参数 pBuffer 有问题...

其他变量的 sting 类型也在工作......

当我使用ref时,我总是得到一个AccessViolation错误 knr12_read()。如果我使用out 我得到一个指针,但字符串总是空的,这不可能。我什至尝试将 String 作为 ref 用于 char*但是我在 knr12_read() 上遇到了 AccessViolation 错误

请指导。

最佳答案

StringBuilder 通常是 P/调用带有字符串返回参数的函数时使用的好类型:

static extern int knr12_read(StringBuilder kn12, ...)

您需要在调用该函数之前初始化字符串生成器,例如:

StringBuilder outString = new StringBuilder(100);

您不需要“不安全”,除非“C”代码保留指针的时间超过调用持续时间,否则您无需担心固定 - 框架会为您完成.

这是一个应该有帮助的 SO 问题:Marshal "char *" in C#

关于c# - C# AccessViolation/Marshalling 中的 native C-DLL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12974875/

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