我试图从C++发送一个图像到C#托管的C++的互操作(编组)。 image->getStream()
从字符串中返回一个const char*
。我的Marshal::Copy
函数有例外。从const char *复制到字节数组C++/c#interop Marshal ::复制
'System.AccessViolationException'
类型的未处理的异常在mscorlib.dll发生其他信息:试图读取或写入保护内存。这通常表明其他内存已损坏。
我在做从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;
}
图像由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;
};
什么类型是图像? System.Drawing.Image,它没有getStream()或getStreamSize()。我认为你的问题的根源在于流不是字节数组。 – shf301
看到上面的代码,我发布了图像代码 – BuzBuza
我的猜测是'wStream'不是'wLen'字节长度。真的不能告诉你。如果你添加'char temp = wStream [wLen-1]'你会得到一个访问冲突。 – shf301