gpt4 book ai didi

c# - Windows Mobile 平台上的 PInvoke

转载 作者:行者123 更新时间:2023-11-30 04:40:13 25 4
gpt4 key购买 nike

所以我正在尝试调用我的非托管 C++ dll 中的函数。

void foo(char* in_file, char * out_file)

在我的 C# 应用程序中,我声明了与

相同的函数
[DllImport("dll.dll")]
public static extern void foo(byte[] in_file, byte[] out_file);

我像这样通过ASCII编码器传递的实际参数

byte[] param1 = Encoding.ASCII.GetBytes(filename1);
byte[] param2 = Encoding.ASCII.GetBytes(filename2);
foo(param1, param2);

一切正常,除非 param1 的长度为 0 或 36 或 72 个字符(字节)。然后由于某种原因,DLL 报告接收到的长度为 1、38、73,最后附加了 0x16 字符。

我已经浪费了半天的时间来调试和理解为什么会这样。有任何想法吗?36的倍数有什么意义?

编辑/解决方案:

在我发布这个之后,一个可能的答案打动了我。通过在将它们转换为字节数组之前将空字符 0x0 附加到我的字符串的末尾,我已经消除了这个问题。尽管我不确定这是否是设计使然。

最佳答案

您自己偶然发现了答案 - 没有任何地方将长度传递给函数。

您需要仔细考虑您在哪些函数上运行这些函数以及 ASCII 是否真的是您想要的。

你可能真的想要这个,不需要 ASCII 编码并且在编码类型中显式空终止:

[DllImport("dll.dll")]
public static extern void foo(
[MarshalAs(LPStr)] string in_file,
[MarshalAs(LPStr)] string out_file);

但是请检查您的 foo() 实现并确保您了解您真正希望传入的内容。

关于c# - Windows Mobile 平台上的 PInvoke,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1659067/

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