将字节数组从 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# 代码应该接受指针为IntPtrUIntPtr,然后它可以将其视为非托管数组。

将指针传递给 C# 代码后,有多种方法可以访问该指针后面的数据。您可以使用Unsafe Code and Pointers,如果您在单个字节上聚会,这可能是最高的性能。

如果要将其视为字节流,可以使用UnmanagedMemoryStream。

或者,您可以使用Marshal.CopyMarshal.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 是一个更复杂的问题,需要复制。请参阅MarshalPtrToString 方法(PtrToStringAnsiPtrToStringAnsi 等)【参考方案2】:

我认为您可以在 C++ 端使用指针,在 C# 端使用 ref。请参阅评论中提供的链接。

【讨论】:

以上是关于将字节数组从 c++ 传递到 c# 程序集都有哪些不同的方法?的主要内容,如果未能解决你的问题,请参考以下文章

将字节数组从 C# 传递到 C++ DLL 作为 char*

将字节数组从 Unity C# 传递到 C++ 库方法

使用 Dllimport 将一个非常大的字符串作为字节数组从 C++ 传递到 C#

如何通过引用从 c# 到 c++ 传递字节数组

将 C# 3D 数组作为 1D 字节数组传递给 C++ 库

如何将字节数组从 c# 传递到 MFC ActiveX