我最近继承了一个混合 C++ 和 C++/CLI (.NET) 的程序。它通过网络连接到其他组件,并连接到某些特殊硬件的驱动程序 DLL。但是,我试图找出通过网络发送数据的最佳方式,因为使用的方式似乎不是最佳的。
数据存储在 C++ 定义的结构中,例如:
struct myCppStructure {
unsigned int field1;
unsigned int field2;
unsigned int dataArray[512];
};
从 C++/CLI 访问结构本身时,程序运行良好。问题是要通过网络发送它,当前代码会执行以下操作:
struct myCppStructure* data;
IntPtr dataPtr(data);
// myNetworkSocket is a NetworkStream cast as a System::IO::Stream^
System::IO::BinaryWriter^ myBinWriter = gcnew BinaryWriter(myNetworkSocket);
__int64 length = sizeof(struct myCppStructure) / sizeof(__int64);
unsigned __int64* ptr = static_cast<__int64*>(dataPtr.toPointer());
for (unsigned int i = 0; i < (length / sizeof(unsigned __int64)); i++)
myBinWriter->Write((*ptr)++);
在普通的 C++ 中,它通常是这样的调用:
myBinWriter->Write(ptr,length);
但我在 C++/CLI 中找不到任何等价的东西。System::IO::BinaryWriter 只有基本类型和其中一些的一些 array<>^ 版本。没有比这更有效的了吗?
PS 这些记录每秒生成很多次;所以做额外的复制(例如编组)是不可能的。
注意:最初的问题是关于 C# 的。我没有意识到我所认为的 C# 实际上是 .NET 下的“托管 C++”(又名 C++/CLI)。以上内容已经过编辑,以将“C#”引用替换为“C++/CLI”引用——我将其用于任何版本的托管 C++,尽管我特别使用的是 .NET 3.5。