2011-08-04 92 views
2

我試圖從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; 
}; 
+0

什麼類型是圖像? System.Drawing.Image,它沒有getStream()或getStreamSize()。我認爲你的問題的根源在於流不是字節數組。 – shf301

+0

看到上面的代碼,我發佈了圖像代碼 – BuzBuza

+0

我的猜測是'wStream'不是'wLen'字節長度。真的不能告訴你。如果你添加'char temp = wStream [wLen-1]'你會得到一個訪問衝突。 – shf301

回答

8

我不會用元帥:複製一個家。既然你有本地陣列,爲什麼不把它釘住並使用memcpy

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

現在,您可以撥打memcpyptrBuffer

當範圍結束時,鎖定自動取消。

+2

做到這一點,它比Marshal.Copy快得多,並且根本不應該傷害GC,正如@AresAvatar所說的那樣,它一旦失去範圍就會自動解鎖。 –

+0

謝謝你的答案。我使用了memcpy。我直接複製到byteArray。的memcpy(字節陣列,wStream,WLEN)。問題是我的wStream是一個指向由ostringstream.str()。c_str()返回的本地const char *的指針。我沒有現在str()返回一個緩衝區副本! – BuzBuza