【发布时间】:2011-08-04 17:37:30
【问题描述】:
我正在尝试通过托管 C++ 的互操作(编组)将图像从 C++ 发送到 C#。 image->getStream() 从字符串中返回 const char*。
我的 Marshal::Copy 函数出现异常。
在 mscorlib.dll 中发生
'System.AccessViolationException'类型的未处理异常附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。
我对从const char* 到字节数组的复制做正确的事情吗?我的 dll 是用 VS2010 中设置的 ASCII 字符编译的。
array<System::Byte>^ OsgViewer::getLastImage()
{
array< Byte >^ byteArray;
m_ImageQueue->lock();
int index = m_ImageQueue->getCurrentImageIndex();
std::shared_ptr<Image> image = m_ImageQueue->getImage(static_cast<unsigned int>(index));
if( image && image->isValid() == true)
{
int wLen = image->getStreamSize();
char* wStream = const_cast<char*>(image->getStream());
byteArray = gcnew array< Byte >(wLen);
// convert native pointer to System::IntPtr with C-Style cast
Marshal::Copy((IntPtr)wStream ,byteArray , 0, wLen);
}
m_ImageQueue->unlock();
return byteArray;
}
Image是一个自制的C++类
class ADAPTER Image
{
public :
Image();
~Image();
const char* getStream() const;
int getStreamSize();
bool setStringStream(std::ostringstream* iStringStream);
void setIsValid(bool isValid){ m_isValid = isValid;}
bool isValid() const{return m_isValid;}
std::ostringstream* getOStringStream() {return m_StringStream;}
private:
std::ostringstream* m_StringStream;
bool m_isValid;
};
【问题讨论】:
-
Image是什么类型的?没有 getStream() 或 getStreamSize() 的 System.Drawing.Image。我认为你的问题的根源是流不是字节数组。
-
看上面的代码,我贴的是图片代码
-
我猜
wStream不是wLen字节长度。真的不能告诉你有。如果您添加char temp = wStream[wLen-1],您是否会遇到访问冲突。 -
你是对的,它在 temp = wStream[wLen-1] 上崩溃了几次
-
那么您从 getStream() 返回的
char*不是wLen字节长。您需要了解为什么getStreamSize()和getStream()的返回值之间存在差异
标签: c# c++ c++-cli marshalling