2009-08-06 23 views
7

O dizinin boyutu (genişlikxyükseklik) gönderiyorsunuz görüntününbilinmeyen Dizi boyutunu Marshalling

Yani bağlıdır

byte[] 

ancak bir bayt dizisi götüren bir yapıya sahip ... nasıl Eğer

[MarshalAs(UnmanagedType.ByValArray, SizeConst = ???)] 
public Byte[] ImageData; 

bayt dizileri C dLL dosyaları için C# geçirilen çalışırken bir ZORUNDADIR SizeConst mi yapacağız?

+0

Özel bir mareşal, tek seçenek gibi görünüyor. – IllidanS4

cevap

2

Marşaling tipini değiştirmeniz gerekir. ByValArray olarak sıralanırsanız, ancak diğer türlerle uyumlu değilse SizeConst gereklidir. Detaylar için UnmanagedType enum'a bakın. ,

[MarshalAs(UnmanagedType.LPArray)] 

Bu yoluyla standart bir C dizi (BYTE *) için Marshall'a çalışmasına neden olur bu yüzden sadece bir işaretçi geçirilir:

Benim şüphe diziye C işaretçi olarak Marshall'a istememizdir vasitasiyla. Bunu yapmak, herhangi bir boyut dizisini geçirmenizi sağlar. Genelde, C/C++ 'da kolayca söyleyebilmenin bir yolu olmadığından, dizi boyutunu başka bir parametre olarak (ya da aynı bilgiyi sağlayan görüntü genişliği/yükseklik/bpp) de geçmek istersiniz.

+0

Cevabınız için teşekkürler Reed. Ancak, bunu yaptım ve şimdi bu hatayı al Geçersiz yönetilen/yönetilmeyen tür bileşimi (Diziler alanları ByValArray veya SafeArray ile eşleştirilmelidir) IntPtr ve daha sonra Marshal.StructureToPtr ... Düşüncelerini oluştururken? – Olewolfe

+0

Numaraya göz atın. Daha fazla bilgi gerekli olurdu. Yönetilen -> yönetilmeyen arasından seçim yaptığınızı varsayıyordum, ancak başka yöne gidiyorsanız, ya Marşal'ı bir IntPtr (bir bayt [] yerine) olarak yapabilir ya da bir SafeArray kullanmak üzere kurabilirsiniz. –

+1

Maalesef [MarshalAs (UnmanagedType.ArrayByVal, sizeConst = xxxx)] öğesinden başka bir şey kullanmıyor bellek adreslemesini karıştırıyor. Öyleyse, esas olarak bir IntPtr'e dönüştürülmesi gereken bir dize() içeren bir dize var, böylece DLL'ye geçirilebilir. Ve bayttaki [] veri berbatlaşıyor. Bunu, veriyi IntPtr'ten bir byte [] dosyasına kopyalayarak ve MarshalA'ları yapıda ayarlamadıkça her şeyin değiştirildiğini bulmak için verilere bakarak doğrulayın. – Olewolfe