从const char*复制到字节数组C++/c#互操作封送处理::复制 我尝试用C++的一个互操作(封送)来将C++的图像发送到C语言。code>image->getStream()从字符串返回一个const char*

从const char*复制到字节数组C++/c#互操作封送处理::复制 我尝试用C++的一个互操作(封送)来将C++的图像发送到C语言。code>image->getStream()从字符串返回一个const char*,c#,c++,c++-cli,marshalling,C#,C++,C++ Cli,Marshalling,我的Marshal::Copy函数出现异常 mscorlib.dll中发生类型为'System.AccessViolationException'的未处理异常 其他信息:尝试读取或写入受保护内存。这通常表示其他内存已损坏 对于从const char*复制到字节数组的操作是否正确?我的dll是用VS2010中的ASCII字符集编译的 array^OsgViewer::getLastImage() { 数组^字节数组; m_ImageQueue->lock(); int index=m_ImageQ

我的
Marshal::Copy
函数出现异常

mscorlib.dll中发生类型为
'System.AccessViolationException'
的未处理异常

其他信息:尝试读取或写入受保护内存。这通常表示其他内存已损坏

对于从
const char*
复制到字节数组的操作是否正确?我的dll是用VS2010中的ASCII字符集编译的

array^OsgViewer::getLastImage()
{
数组<字节>^字节数组;
m_ImageQueue->lock();
int index=m_ImageQueue->getCurrentImageIndex();
std::shared_ptr image=m_ImageQueue->getImage(静态_cast(索引));
if(image&&image->isValid()==true)
{
int-wLen=image->getStreamSize();
char*wStream=const_cast(image->getStream());
byteArray=gcnew array(wLen);
//使用C样式转换将本机指针转换为System::IntPtr
封送:复制((IntPtr)wStream,byteArray,0,wLen);
}
m_ImageQueue->unlock();
乘火车返回;
}

图像是自制的C++类

类适配器映像
{
公众:
图像();
~Image();
常量char*getStream()常量;
int getStreamSize();
bool-setStringStream(std::ostringstream*iStringStream);
void setIsValid(bool isValid){m_isValid=isValid;}
bool isValid()常量{return m_isValid;}
std::ostringstream*getOStringStream(){return m_StringStream;}
私人:
std::ostringstream*m_StringStream;
布尔m_是有效的;
};

我不会使用Marshal::Copy。既然阵列在本地,为什么不将其固定并使用
memcpy

pin_ptr<Byte> ptrBuffer = &byteArray[byteArray->GetLowerBound(0)];
pin_ptr ptrBuffer=&byteArray[byteArray->GetLowerBound(0)];
您现在可以调用
memcpy
ptrBuffer


当作用域结束时,锁定会自动撤消。

这样做,它比Marshal.Copy快得多,而且不会伤害GC,正如@AresAvatar所说,一旦失去作用域,它就会自动解除锁定。谢谢你的回答。我用memcpy。我直接复印给byteArray。memcpy(byteArray、wStream、wLen)。问题是我的wStream是一个指向ostringstream.str().c_str()返回的本地const char*的指针。我现在没有看到str()返回缓冲区副本!。图像是什么类型的?没有getStream()或getStreamSize()的System.Drawing.Image。但我认为问题的根源在于流不是字节数组。参见上面的代码,我发布了图像代码我猜
wStream
不是
wLen
字节长度。从你身上看不出来。如果添加
char temp=wStream[wLen-1]
是否会出现访问冲突。没错,它会在temp=wStream[wLen-1]上崩溃几次,那么从getStream()返回的
char*
长度不是
wLen
字节。您需要了解为什么
getStreamSize()
getStream()的返回值之间存在差异