我有两个非托管C++函数,Compress
和Decompress
。参数和返回去如下:如何将两个非托管C++函数包装到两个托管C#函数中?
无符号字符* Compress
(无符号字符*,INT)
无符号字符* Decompress
(无符号字符*,INT)
所有uchars是uchars的阵列。
有人可以帮我摆出一种方法来使用字节[]数组而不是unsigned char *将这些转换为托管的C#代码吗?非常感谢你!
我有两个非托管C++函数,Compress
和Decompress
。参数和返回去如下:如何将两个非托管C++函数包装到两个托管C#函数中?
无符号字符* Compress
(无符号字符*,INT)
无符号字符* Decompress
(无符号字符*,INT)
所有uchars是uchars的阵列。
有人可以帮我摆出一种方法来使用字节[]数组而不是unsigned char *将这些转换为托管的C#代码吗?非常感谢你!
您应该能够以byte []形式传递unsigned char *参数,标准P/Invoke编组人员应该处理该参数。你将不得不自己封送输出的unsigned char *,但这只是对Marshall.Copy()的调用。请参阅下面的例子,了解我的想法。
两大问题:
样品:
[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;
}
谢谢!这应该现在正常工作,我有一些功能,可以获得解压缩输出的大小以及压缩输出。我唯一的问题是我如何在C#中释放输出。 – Gbps 2010-05-06 02:23:24
不太清楚:你要一)重塑功能,B)写在托管C为他们包装++或C)将它们编译成非托管DLL和调用它们.NET使用P/Invoke? – 2010-05-06 01:56:17
托管和非托管在问题标题上是多余的。 你有什么是你需要包装到C#中的两个C++函数 – Panic 2010-05-06 02:12:05
我想使用P/Invoke从.NET调用它们,我很抱歉没有足够清楚。 – Gbps 2010-05-06 02:24:23