在託管**中對非託管函式進行互操作,需要對引數和返回值進行資料傳遞的過程,此過程有clr
的封送處理服務(封送拆送器)完成。 其工作內容如下:
1. 將資料從託管型別轉換為非託管型別,或從非託管型別轉換為託管型別;
2. 將經過型別轉換的資料從託管**記憶體複製到非託管記憶體,或從非託管記憶體複製到託管記憶體;
3. 呼叫完成後,釋放封送處理過程中分配的記憶體。
資料封送處理的目的:保證託管**和非託管**中定義的資料在記憶體中布局相同,從而資料正確傳送。
封送資料型別包含:可直接複製到本機結構中的型別和非直接複製到本機結構中的型別。
即在託管和非託管中,資料型別在記憶體表現形式一樣的。這些資料不需要封送拆分器處理。
windows 資料型別
非託管資料型別
託管資料型別
託管資料型別解釋
byte/uchar/uint8
unsigned char
system.byte
無符號8
位整型sbyte/char/int8
char
system.sbyte
有符號8
位整型short/int16
short
system.int16
有符號16
位整型ushort/word/uint16/wchar
unsigned short
system.uint16
無符號16
位整型bool/hresult/int/long
long/int
system.int32
有符號32
位整型dword/ulong/uint
unsigned long/unsigned int
system.uint32
無符號32
位整型int64/longlong
_int64
system.int64
有符號64
位整型uint64/dwordlong/ulonglong
_uint64
system.uint64
無符號64
位整型int_ptr/handle/wparam
void*/int或
_int64
system.intptr
有符號指標型別
handle
void*
system.uintptr
無符號指標型別
float
float
system.single
單精度浮點數
double
double
system.double
雙精度浮點數
需要封送處理。
windows 資料型別
非託管資料型別
託管資料型別
託管資料型別解釋
bool
bool
system.boolean
布林型別
wchar/tchar
char/ wchar_t
system.char
ansi字元
/unicode
字元lpcstr/lpcwstr/lpctstr/lpstr/lpwstr/lptstr
const char*/const wchar_t*/char*/wchar_t*
system.string
ansi字串
/unicode
字串,如果非託管**不需要更新此字串時,此時用
string
型別在託管**中宣告字串型別
lpstr/lpwstr/lptstr
char*/wchar_t*
system.stringbuilder
ansi字串
/unicode
字串,如果非託管**需要更新此字串,然後把更新的字串傳回託管**中,此時用
stringbuilder
型別在託管**中宣告字串
以struct
為例,對其包含
string
物件的,需要保證託管和非託管的記憶體形式一樣,其大小需一致。
typedef
struct
patimage ;
__declspec
(dllexport
)int
__stdcall
readpatimage(
char
* filename, ushort* bufdata,
patimage& patimage);
[structlayout
(layoutkind
.sequential)]
public
struct
patimage
[dllimport
("dcmdatawin32.dll"
, entrypoint =
"readpatimage"
)]
public
static
extern
intreadpatimage(
string
filename, [
marshalas
(unmanagedtype
.lparray, sizeparamindex = 1)]
ushort
bufdata,
refpatimage
patimage);
另外,針對string
,託管**中可使用
stringbulider
先宣告大小,然後作為引數,可返回值,但
stringbulider
不可定義
struct
中的變數,否則執行時候會提示錯誤,並提示說使用
string
及初始化的方法取代。
__declspec
(dllexport
)int
__stdcall
fndcmdatawin32(
char
* value);
[dllimport
("dcmdatawin32.dll")]
public
static
extern
intfndcmdatawin32(
stringbuilder
value);
參考:
C 資料封裝
所有的 c 程式都有以下兩個基本要素 封裝是物件導向程式設計中的把資料和運算元據的函式繫結在一起的乙個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。資料封裝引申出了另乙個重要的 oop 概念,即資料隱藏。資料封裝是一種把資料和運算元據的函式 在一起的機制,資料抽象是一種僅向使用者暴露介面而把...
C 資料封裝
一 c 資料封裝 所有的 c 程式都有以下兩個基本要素 封裝是物件導向程式設計中的把資料和運算元據的函式繫結在一起的乙個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。資料封裝引申出了另乙個重要的 oop 概念,即資料隱藏。資料封裝是一種把資料和運算元據的函式 在一起的機制,資料抽象是一種僅向...
C 資料封裝
所有的 c 程式都有以下兩個基本要素 封裝是物件導向程式設計中的把資料和運算元據的函式繫結在一起的乙個概念,這樣能避免受到外界的干擾和誤用,從而確保了安全。資料封裝引申出了另乙個重要的 oop 概念,即資料隱藏。資料封裝是一種把資料和運算元據的函式 在一起的機制,資料抽象是一種僅向使用者暴露介面而把...