2009-11-06 106 views
1

我有喜歡訪問C++結構在C#

struct VideoInputV20 { 
    int m_nBrightness; 
    int m_nSharpness; 
    int m_nSaturation; 
    int m_nContrast; 
    int m_nInputState; 
    CString m_sObjref; 
}; 

在這裏,在C#中的VC++ stucture我會收到此stucture中的byte []。在這裏我需要將byte []轉換爲stuct。

我該如何實現這一目標?如果可能,請提供示例代碼。

+0

我不知道你問的......可你改說這個? – 2009-11-06 12:39:23

回答

4

聲明你的結構在C#:

[StructLayout(LayoutKind.Sequential, Pack = 2, CharSet = CharSet.Ansi)] 
struct VideoInputV20 
{ 
    int m_nBrightness; 
    int m_nSharpness; 
    int m_nSaturation; 
    int m_nContrast; 
    int m_nInputState; 
    [MarshalAs(UnmanagedType.LPWStr)] 
    string m_sObjref; 
} 

然後代碼把它弄出來一個byte []

GCHandle handle = new GCHandle(); 
try 
{ 
    // Pin the byte[] 
    handle = GCHandle.Alloc(yourByteArray, GCHandleType.Pinned); 
    IntPtr ptr = handle.AddrOfPinnedObject(); 

    // Marshal byte[] into struct instance 
    VideoInputV20 myVideoInputV20 = (VideoInputV20)Marshal.PtrToStructure(ptr, typeof(VideoInputV20)); 
} 
// Clean up memory 
finally 
{ 
    if (handle.IsAllocated) handle.Free(); 
} 
+0

什麼是GCHandle我如何聲明.net2003 – 2009-11-06 14:01:01

+0

您需要添加System.Runtime.InteropServices命名空間,它應該可用。它是.NET Framework 1.1的一部分 – ParmesanCodice 2009-11-07 07:59:28

1

不好。 Ints相對容易恢復,但CString的對象序列化依賴於平臺和編譯器。嘗試在C++中將其轉換爲其他表示形式。

0

byte[] data = GetData(); 
int structSize = Marshal.SizeOf(VideoInputV20); 

if(structSize <= data.Length) 
{ 
    IntPtr buffer = Marshal.AllocHGlobal(structSize); 
    Marshal.Copy(data, 0, buffer, structSize); 
    VideoInputV20 vi = (VideoInputV20)Marshal.PtrToStructure(buffer, VideoInputV20); 
    Marshal.FreeHGlobal(buffer); 
}