2012-03-26 46 views
2

我想從C++元帥到C#中的結構,看起來像這樣的一個C數組的第一個元素的結構:如何編組包含指向未知類型

typedef struct FooStruct { 
    Uint8 bytesPerThingie; 
    void *arrayOfThingies; 
    // other members ... 
} 

所以,在這個case有兩個未知數:

  1. 數組中的元素數。
  2. 每個元素的大小(以字節爲單位)。

我已經成功地封的結構本身之前有這樣的定義:

[StructLayout(LayoutKind.Sequential)] 
public struct FooStruct { 
    public byte bytesPerThingie; 
    public IntPtr arrayOfThingies; 
    // other members... 
} 

但現在我需要檢查和修改嵌入式陣列。

我明白

  1. 其本身而言,一個blittable類型的blittable元件的陣列是 本身blittable,而不是當它被用作一個場一 結構內。
  2. 從非託管代碼封送到.NET Framework時,數組長度爲 ,該值由SizeConst參數確定,如果不是blittable,則數組元素的非託管類型 可選。

即使假定在這種情況下數組中的元素屬於blittable類型,如果直到運行時才能知道數組的大小,我怎樣才能設置SizeConst,一個編譯時參數?

+0

你不能使用'SizeConst'。你很可能不得不自己進行編組。 – 2012-03-26 20:49:26

回答

2

長話短說,你不能。 上的SizeConst field被編譯到該字段中的元數據上,並且不能在運行時更改(至少,不會有益於您的方式)。

這就是說,你有以下幾種選擇:

  • 元帥的內容作爲手動您一直使用的Marshal class的方法做。
  • 使用unsafe直接訪問指針(並將您的類型更改爲使用指針)。這需要/unsafe compiler option,這可能是也可能不是您的選擇。
  • 使用C++/CLI在C++中創建一個託管包裝器,該包裝器將導出.NET類型,但在C++中處理編組(這可能更容易,具體取決於您的舒適級別以及您試圖訪問的API的複雜程度)。

注意,在以上的情況下,所有,你還必須知道返回的數組的長度(它可能在結構上與指針和類型一起)。

+0

謝謝,這有助於。 (是的,數組的長度是結構的成員之一。) – Buggieboy 2012-03-27 02:17:46

相關問題