gpt4 book ai didi

c# - 将 DLLImport 与包含空字符的输出 char[] 一起使用

转载 作者:行者123 更新时间:2023-11-30 22:48:09 26 4
gpt4 key购买 nike

我正在使用 .NET 2.0 编写一个 C# 应用程序。我需要使用旧库进行专有压缩。我没有该库的源代码,它背后的开发人员早已不复存在。

我的问题是生成的 char[] 包含空值,并且被截断了。这是函数的声明:

[DLLImport("foo.dll")]
public static extern bool CompressString(char[] inputValue, out char[] outputValue, uint inputLength, out uint outputLength);

我如何声明输出 char[] 应该作为 byte[] 处理,而不是 null 终止?


更多信息:

我有头文件。这是声明:

BOOL CompressString(char *DecompBuff, char **RetBuff, unsigned long DecompLen, unsigned long *RetCompLen);

最佳答案

看看 MSDN article用于在 P/Invoke 中传递数组。我认为您可能想要使用 SizeParamIndex 来告诉编码器哪个参数保存传递的数组的大小。

编辑:很遗憾,SizeParamIndex 不允许用于 outref 参数。但是,您可以手动复制它:

[DLLImport("foo.dll")]
public static extern bool CompressString([MarshalAs(UnmanagedType.LPArray, SizeParamIndex=2)] char[] inputValue, out IntPtr outputValue, uint inputLength, out uint outputLength);

public static bool CompressStringInvoke(char[] inputValue, out char[] outputValue, uint inputLength) {
IntPtr outputPtr;
uint outputLen;
if (CompressString(inputValue, out outputPtr, inputLength, out outputLen)) {
outputValue = new char[outputLen];
Marshal.Copy(outputPtr, outputValue, 0, (int)outputLen);
return true;
}
outputValue = new char[0];
return false;
}

关于c# - 将 DLLImport 与包含空字符的输出 char[] 一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1861622/

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