Скопировать из const char * в байтовый массив C ++ / c # interop Marshal :: Copy - PullRequest
2 голосов
/ 04 августа 2011

Я пытаюсь отправить изображение из C ++ в C # с управляемым взаимодействием (маршалингом) C ++.image->getStream() возвращает const char* из строки.

У меня возникла исключительная ситуация с моей Marshal::Copy функцией.

В mscorlib возникло необработанное исключение типа 'System.AccessViolationException'.dll

Дополнительная информация: Попытка чтения или записи в защищенную память.Это часто указывает на то, что другая память повреждена.

Правильно ли я делаю копию из const char* в байтовый массив?Моя dll скомпилирована с набором символов ASCII, установленным в VS2010.

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;
};

1 Ответ

9 голосов
/ 04 августа 2011

Я бы не использовал Marshal :: Copy.Поскольку у вас есть массив локально, почему бы просто не закрепить его и использовать memcpy?

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

Теперь вы можете вызывать memcpy до ptrBuffer.

Когда заканчивается прицел, пиннинг автоматически отменяется.

...