作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以我正在尝试调用我的非托管 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/
我正在开发一个在 VS 社区 2017 中开发并使用 IIS Express 10 的 .net Core MVVC 项目,我遇到了 TempData 无法在我开发的 3 台计算机中的两台上运行的问题
我是一名优秀的程序员,十分优秀!