關於結構的封送,先看乙個類 structlayoutattribute
該類的作用是,允許控制記憶體中類或結構的資料字段的物理布局。
該類的層次結構為:
system.object system.attributesystem.runtime.interopservices.structlayoutattribute.
以下主要是在c/c++ 與 c#之間的結構體封送的說明
在c/c++中定義有如下結構體:
typedef struct taginetaddr_t
inetaddr_t
而在c#中要定義乙個適用的結構體時,可以使用該類控制結構成員的布局情況,例:
[structlayoutattribute(layoutkind.sequential, charset = charset.ansi)]
public struct taginetaddr_t
在託管**和非託管**之間進行資料的封送使用structlayoutattribute的特性,以控制型別的非託管布局。
structlayoutattribute特性含有兩種型別的布局方式,一種是layoutkind.sequential,另一種是layoutkind.explicit。
可以按照成員放置的順序布局。如上所示,整個結構體大小為8位元組,前4個位元組為uint ip,然後2個位元組為ushort port,最後2位元組為macreserved.(c#中的陣列成員不能直接定義,而是需要向上所示一樣,宣告型別變數,然後指定為陣列型別,並制定長度,對於字串,需要將unmanagedtype型別設定為byvaltstr,並且在使用之前,需要定義長度)。
在結構內精確控制每個成員的位置,使用時,必須使用fieldoffsetattribute特性指示型別中的每個欄位中的位置。
例:c/c++中union的實現.
c#中並沒有union關鍵字,所以需要我們手動去實現相關操作,layoutkind.explicit布局就剛好能滿足需要.
在c中有如下union結構:
typedef struct tagemtpheader_t
emtpheader_t;
typedef union tagemtpprotocol_u
emtpprotocol_u;
typedef union tagemtpprotocol_t
emtpprotocol_t;
在c#中的適用結構為:
[structlayout(layoutkind.sequential)]
public struct emtpheader_t
[structlayout(layoutkind.explicit)]
public struct emtpprotocol_u
[structlayout(layoutkind.explicit)]
public struct emtpprotocol_t
注意:emtpheader_t結構用layoutkind.sequential布局方式固定了,而emtpprotocol_u成員中的all成員則出現在emtpheader_t成員長度12之後,注意fieldoffset偏移位置。
指標型別在c/c++中只占用了4個位元組的大小,在c#中,統一使用intptr代替。
public struct exmple_t
託管平台呼叫的引數封送
在平台呼叫中,因為託管型別和非託管型別之間有差異,所以需要進行入參與出參的封送才可正常的呼叫非託管的函式。在所有要進行封送的引數型別之中,大體分為兩種 可直接複製到本機結構中的型別 blittable 和非直接複製到本機結構中的型別 non bittable blittable型別轉換對照表 win...
C 呼叫dll 封送結構體 結構體陣列
一.結構體的傳遞 cpp define jnaapi extern c declspec dllexport c方式匯出函式 typedef struct osinfo 1.獲取版本資訊 傳遞結構體指標 jnaapi bool getversionptr osinfo info 2.獲取版本資訊 傳...
C 呼叫C C 動態庫 封送結構體,結構體陣列
一.結構體的傳遞 cpp define jnaapi extern c declspec dllexport c方式匯出函式 typedef struct osinfo 1.獲取版本資訊 傳遞結構體指標 jnaapi bool getversionptr osinfo info 2.獲取版本資訊 傳...