平台呼叫 結構的封送

2021-08-04 12:16:02 字數 1819 閱讀 5866

關於結構的封送,先看乙個類 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.獲取版本資訊 傳...