从const char *复制到字节数组C ++ / c #interop Marshal :: Copy

时间:2011-08-04 17:37:31

标签: c# c++ c++-cli marshalling

我正在尝试使用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;
};

1 个答案:

答案 0 :(得分:9)

我不会使用Marshal :: Copy。由于您在本地拥有该数组,为什么不将它固定并使用memcpy

pin_ptr<Byte> ptrBuffer = &byteArray[byteArray->GetLowerBound(0)];

您现在可以致电memcpyptrBuffer

当示波器结束时,固定将自动撤消。