将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?
Posted
技术标签:
【中文标题】将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?【英文标题】:What are the different ways to pass a byte array from c++ to a c# assembly?将字节数组从 c++ 传递到 c# 程序集有哪些不同的方法? 【发布时间】:2012-11-28 02:00:44 【问题描述】:我想知道可用于将字节数组从 c++ 传递到 c# 的不同方法及其性能特征。理想情况下,我希望将指向非托管堆中字节数组的指针传递给 C# 程序集,并避免任何复制操作。
【问题讨论】:
你想返回一个指向 C# 调用者的指针吗?还是让 C++ 代码调用 C# 方法? 让 c++ 代码调用 C# 方法。 你可以试试参考这个。 ***.com/questions/1167342/… 【参考方案1】:假设您使用 Reverse P/Invoke 之类的东西从非托管 C++ 调用 C# 方法,您可以只传递指针。 C# 代码应该接受指针为IntPtr
或UIntPtr
,然后它可以将其视为非托管数组。
将指针传递给 C# 代码后,有多种方法可以访问该指针后面的数据。您可以使用Unsafe Code and Pointers,如果您在单个字节上聚会,这可能是最高的性能。
如果要将其视为字节流,可以使用UnmanagedMemoryStream。
或者,您可以使用Marshal.Copy
和Marshal.Read
(许多变体)方法在该缓冲区的不同区域读取不同的数据类型。
以上都不需要在 C++ 和 C# 代码之间复制指针本身以外的任何数据。
毫无疑问,还有其他我没有在上面列出的从 C# 访问内存的方法。它的要点是,以任何一种方式传递一个字节数组都非常轻松。
【讨论】:
我希望使用 COM 互操作来调用 C# 方法。类似于这篇文章的东西 - codeproject.com/Articles/16206/… @SriramSubramanian:请参阅向 COM 公开 .NET Framework 组件:msdn.microsoft.com/en-us/library/aa720072(v=vs.71).aspx。您应该能够直接传递一个字节数组(通过 COM 分配),然后将其用作IntPtr
,如上所述。
谢谢。这是否也适用于 char* 到 c# 字符串对象?
@SriramSubramanian:不。通过 C++ char*
并制作 C# string
是一个更复杂的问题,需要复制。请参阅Marshal
类PtrToString
方法(PtrToStringAnsi
、PtrToStringAnsi
等)【参考方案2】:
我认为您可以在 C++ 端使用指针,在 C# 端使用 ref。请参阅评论中提供的链接。
【讨论】:
以上是关于将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?的主要内容,如果未能解决你的问题,请参考以下文章
将字节数组从 C# 传递到 C++ DLL 作为 char*