2010-05-06 78 views
0

我有两个非托管C++函数,CompressDecompress。参数和返回去如下:如何将两个非托管C++函数包装到两个托管C#函数中?

无符号字符* Compress(无符号字符*,INT)

无符号字符* Decompress(无符号字符*,INT)

所有uchars是uchars的阵列。

有人可以帮我摆出一种方法来使用字节[]数组而不是unsigned char *将这些转换为托管的C#代码吗?非常感谢你!

+1

不太清楚:你要一)重塑功能,B)写在托管C为他们包装++或C)将它们编译成非托管DLL和调用它们.NET使用P/Invoke? – 2010-05-06 01:56:17

+0

托管和非托管在问题标题上是多余的。 你有什么是你需要包装到C#中的两个C++函数 – Panic 2010-05-06 02:12:05

+0

我想使用P/Invoke从.NET调用它们,我很抱歉没有足够清楚。 – Gbps 2010-05-06 02:24:23

回答

1

您应该能够以byte []形式传递unsigned char *参数,标准P/Invoke编组人员应该处理该参数。你将不得不自己封送输出的unsigned char *,但这只是对Marshall.Copy()的调用。请参阅下面的例子,了解我的想法。

两大问题:

  1. 如何调用者知道存放在回归无符号字符*缓冲数据的大小?
  2. 如何为返回无符号字符*缓冲区分配内存?你需要释放它吗?如果你需要,你将如何从C#中释放它?

样品:

[DllImport("Name.dll")] 
    private static extern IntPtr Compress([MarshalAs(UnmanagedType.LPArray)]byte[] buffer, int size); 

    [DllImport("Name.dll")] 
    private static extern IntPtr Decompress([MarshalAs(UnmanagedType.LPArray)]byte[] buffer, int size); 

    public static byte[] Compress(byte[] buffer) { 
     IntPtr output = Compress(buffer, buffer.Length); 
     /* Does output need to be freed? */ 
     byte[] outputBuffer = new byte[/*some size?*/]; 
     Marshal.Copy(output, outputBuffer, 0, outputBuffer.Length); 
     return outputBuffer; 
    } 

    public static byte[] Decompress(byte[] buffer) { 
     IntPtr output = Decompress(buffer, buffer.Length); 
     /* Does output need to be freed? */ 
     byte[] outputBuffer = new byte[/*some size?*/]; 
     Marshal.Copy(output, outputBuffer, 0, outputBuffer.Length); 
     return outputBuffer; 
    } 
+0

谢谢!这应该现在正常工作,我有一些功能,可以获得解压缩输出的大小以及压缩输出。我唯一的问题是我如何在C#中释放输出。 – Gbps 2010-05-06 02:23:24

相关问题