代码之家  ›  专栏  ›  技术社区  ›  Jon B

对包含空字符的输出字符[]使用DLLImport

  •  2
  • Jon B  · 技术社区  · 16 年前

    我正在用.NET2.0编写一个c#应用程序。我需要使用一个旧库进行专有压缩。我没有这个库的源代码,它背后的开发人员早已不在了。

    我的问题是,生成的char[]包含null,并且正在被截断。以下是函数的声明:

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


    更多信息:

    BOOL CompressString(char *DecompBuff, char **RetBuff, unsigned long DecompLen, unsigned long *RetCompLen);
    
    2 回复  |  直到 16 年前
        1
  •  3
  •   Jon B    16 年前

    看一看这本书 MSDN article 用于在P/Invoke中传递数组。我想你可能想使用 SizeParamIndex

    编辑: out ref 参数。但是,您可以手动复制它:

    [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;
    }
    
        2
  •  0
  •   Raj    16 年前