2011-06-18 15 views
6

Mam następujący struct w C#Struct marszałek w C#

unsafe public struct control 
    { 
     public int bSetComPort; 
     public int iComPortIndex; 
     public int iBaudRate; 
     public int iManufactoryID; 
     public byte btAddressOfCamera; 
     public int iCameraParam; 
     public byte PresetNum; 
     public byte PresetWaitTime; 
     public byte Group; 
     public byte AutoCruiseStatus; 
     public byte Channel; 
     public fixed byte Data[64]; 
    } 

a funkcja używam go przekonwertować do bajtów tablicy [] jest

static byte[] structtobyte(object obj) 
    { 
     int len = Marshal.SizeOf(obj); 
     byte[] arr = new byte[len]; 
     IntPtr ptr = Marshal.AllocHGlobal(len); 
     Marshal.StructureToPtr(obj, ptr, true); 
     Marshal.Copy(ptr, arr, 0, len); 
     Marshal.FreeHGlobal(ptr); 
     return arr; 
    } 

kiedy mogę skompilować daje

Type 'System.Byte[]' cannot be marshaled as an unmanaged structure; no meaningful size or offset can be computed. 

Jaki może być problem? Z góry dziękuję!

+0

Twój kod działa poprawnie, problem musi być gdzieś indziej, najprawdopodobniej próbujesz przekonwertować inny typ. – svick

+0

Konwertuję moją strukturę, problemem jest tablica bajtów w strukturze. –

+0

To nie jest. Wypróbowałem twój kod i działa dobrze tak, jak to opublikowałeś. – svick

Odpowiedz

-1

Błąd zgłaszany jako błąd kompilacji jest w rzeczywistości błędem środowiska wykonawczego (ArgumentException). Gdy chcesz korzystać structtobyte konwertować control do byte[] należy podać metodę odniesienie do control, a nie byte array (byte[]).

control ctrl = new control(); 
byte[] bytes = structtobyte(ctrl); 
+0

kontrola cnt; structtobyte (cnt); Przekazuję mi moją edytowaną strukturę cnt, jest ona wypełniona danymi. –

+0

Nie podano położenia stosu/wyjątku stosu, ale wyjątek, który otrzymasz, najprawdopodobniej pochodzi z 'Marshal.SizeOf'. Komunikat o wyjątku wyraźnie stwierdza, że ​​dostarczasz tablicę bajtów. Stąd moja odpowiedź. –

3

SizeOf nie działa na tablicach. Zamiast tego użyj array.Length * Marshal.SizeOf(elementType).

+0

To znaczy! Jestem długo ganiony, dlaczego daje mi nieprawidłowy rozmiar obiektu struktury - więc powodem było to, że struktura miała w sobie tablice ... ⁺¹ –