最近、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 これらのレコードは 1 秒間に何度も生成されます。そのため、追加のコピー(マーシャリングなど)を行うことは問題外です。
注: 元の質問は C# に関するものでした。私が C# として考えていたものが、実際には .NET の下の "Managed C++" (別名 C++/CLI) であることに気付きませんでした。上記は、「C#」参照を「C++/CLI」参照に置き換えるように編集されています。これは、Managed C++ のすべてのバージョンで使用していますが、特に .NET 3.5 を使用しています。