2013-12-18 17 views
0

我的程序由3个部件
1)C#前端
2)的C#方法C++/CLI包装器
3)C++后端呼叫接受字节[]与非托管IntPtr的

C#的FE包含了方法,通过从HttpWebRequest类获得Stream与网络进行通信。这个方法通过包装器传递给C++后端,当它有新的字节发送时,它会调用它。

C# 
void WriteBytes(IntPtr pBody, int cbBody); // Marshal.Copy'es the data from 
    IntPtr to managed byte[], then calls Stream.WriteBytes(byte[], ...) 

C++/CLI 
void WriteBytes(System::IntPtr pBody, int cbBody); // uses 
    Marshal::GetFunctionPointerForDelegate 

C++ 
void WriteBytes(const BYTE* pBody, size_t cbBody); // calls function pointer 
    received from the wrapper 

我想优化这种不从非托管BYTE *复制字节来管理字节[],如I控制各阶段的存储器分配。
这可能吗?
它应该提高性能吗?

+0

任何人......?这非常重要。 – Itsik

+0

是的,避免复制可以提高性能。如果您控制内存分配,请使用托管字节[]开始,并将固定数组的指针传递给本机代码。 –

+0

另外,C++ CLI消除了对GetFunctionPointerForDelegate –

回答

0

您不能将任意缓冲区转换为array<Byte>,但您可以将array<Byte>固定并获取一个非托管指针指向其第一个元素,该指针有效,直到该对象被解除固定。

请参阅pin_ptr<>C++/CLIGCHandle类,如果您想从C#中完成。