2014-10-03 93 views
0

我一直在掙扎如何傳遞一個結構,包含字節數組到C++ dll的第二天。也就是說,我不知道如何編組C#結構。這裏是我的代碼:包含字節數組的編組結構

在C#程序
in C++ dll: 

    struct Image 
    { 
     int Width; 
     int Height; 
     int Depth; 
     uchar *Data; 
    }; 
    ..... 
__declspec(dllexport) void DirectTransform(Image *InImage, Image*DestImage) 
{ 
...Implementation... 
} 

[StructLayout(LayoutKind.Sequential)] 
    struct ImageData 
    { 
     public int Width; 
     public int Height; 
     public int Depth; 
     [MarshalAs(UnmanagedType.LPArray)] 
     public byte[] Data; 
    } 
[DllImport("MyDll.dll",CallingConvention=CallingConvention.Cdecl)] 
     public static extern void DirectTransform(ImageData Src, ImageData Dest); 

//Fill out both structures.. 

     DirectTransform(Image, DestImage); 

異常拋出在DirectTransform的電話,並說:

無法編組場 '數據' type'ImageData的」 :託管/非託管無效 類型組合(數組字段必須與ByValArray或 SafeArray配對)。

當我改變LPArray到ByValArray和指向數組的大小(在這種情況下,202500)也不起作用,因爲尺寸太大。當使用SafeArray時,DLL中的程序將失敗並顯示以下消息:

試圖讀取或寫入受保護的內存。這通常是指示其他內存已損壞的 。 結構中的數據是錯誤的。

任何人都可以幫助我嗎?

+0

它必須是IntPtr,用Marshal.AllocHGlobal()初始化它。然而,* Dest *參數是一個問題,你要麼不知道要分配多大的數組,要麼C代碼分配它,然後發生內存泄漏。 – 2014-10-03 08:37:09

回答

0

看這個question

你可以嘗試一個指針傳遞給你的陣列,例如一個整數長度字段。 這樣做,你需要手動分配使用Marshal.AllocHGlobal非託管內存,調用你的函數,之後在finally塊 - 後明確自己與Marshal.FreeHGlobal

隨着Marshal.Copy方法,則需要複製數據到分配的內存。

+0

謝謝。我已經通過這種方式解決了這個問題。 – user2760303 2014-10-03 13:17:08