C#調(diào)用C++版本dll時的類型轉(zhuǎn)換需要注意的問題小結(jié)
更新時間:2010年04月15日 00:09:58 作者:
最近使用C#調(diào)用C++版本的dll遇到很多類型轉(zhuǎn)換的問題,現(xiàn)記錄出容易出錯的部分。
C#對于C++的dll引用時,經(jīng)常會遇到類型轉(zhuǎn)換和struct的轉(zhuǎn)換
1. C++ 里的Char類型是1 個字節(jié),c#里的Char是兩個字節(jié),不可以對應(yīng)使用;可使用c#里的byte對應(yīng)
2. structType temp = (structType)Marshal.PtrToStructure(IntPtr, typeof(structType));說明:此方式轉(zhuǎn)換只針對包含c++基本類型的結(jié)構(gòu)體,如果包含指針數(shù)組的結(jié)構(gòu)體,使用泛型函數(shù)比較方便。
3. [StructLayoutAttribute(LayoutKind.Sequential)] 說明:StructLayoutAttribute 類 使 用戶可以控制類或結(jié)構(gòu)的數(shù)據(jù)字段的物理布局;LayoutKind控制當導(dǎo)出到非托管代碼時對象的布局。
4. [MarshalAsAttribute(UnmanagedType.LPWStr)] 指示如何在托管代碼和非托管代碼之間封送數(shù)據(jù);說明:UnmanagedType指定如何將參數(shù)或字段封送到非托管代碼。
托管代碼 (managed code)
由公共語言運行庫環(huán)境(而不是直接由操作系統(tǒng))執(zhí)行的代碼。托管代碼應(yīng)用程序可以獲得公共語言運行庫服務(wù),例如自動垃圾回收、運行庫類型檢查和安全支持等。這些服務(wù)幫助提供獨立于平臺和語言的、統(tǒng)一的托管代碼應(yīng)用程序行為。
托管代碼是可以使用20多種支持Microsoft .NET Framework的高級語言編寫的代碼,它們包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的語言共享統(tǒng)一的類庫集合,并能被編碼成為中間語言(IL)。運行庫編譯器(runtime-aware compiler)在托管執(zhí)行環(huán)境下編譯中間語言(IL)使之成為本地可執(zhí)行的代碼,并使用數(shù)組邊界和索引檢查,異常處理,垃圾回收等手段確保類型的安全。
在托管執(zhí)行環(huán)境中使用托管代碼及其編譯,可以避免許多典型的導(dǎo)致安全黑洞和不穩(wěn)定程序的編程錯誤。同樣,許多不可靠的設(shè)計也自動的被增強了安全性,例如 類型安全檢查,內(nèi)存管理和釋放無效對象。程序員可以花更多的精力關(guān)注程序的應(yīng)用邏輯設(shè)計并可以減少代碼的編寫量。這就意味著更短的開發(fā)時間和更健壯的程序。
非托管代碼 (unmanaged code)
在公共語言運行庫環(huán)境的外部,由操作系統(tǒng)直接執(zhí)行的代碼。非托管代碼必須提供自己的垃圾回收、類型檢查、安全支持等服務(wù);它與托管代碼不同,后者從公共語言運行庫中獲得這些服務(wù)。
1. C++ 里的Char類型是1 個字節(jié),c#里的Char是兩個字節(jié),不可以對應(yīng)使用;可使用c#里的byte對應(yīng)
2. structType temp = (structType)Marshal.PtrToStructure(IntPtr, typeof(structType));說明:此方式轉(zhuǎn)換只針對包含c++基本類型的結(jié)構(gòu)體,如果包含指針數(shù)組的結(jié)構(gòu)體,使用泛型函數(shù)比較方便。
3. [StructLayoutAttribute(LayoutKind.Sequential)] 說明:StructLayoutAttribute 類 使 用戶可以控制類或結(jié)構(gòu)的數(shù)據(jù)字段的物理布局;LayoutKind控制當導(dǎo)出到非托管代碼時對象的布局。
4. [MarshalAsAttribute(UnmanagedType.LPWStr)] 指示如何在托管代碼和非托管代碼之間封送數(shù)據(jù);說明:UnmanagedType指定如何將參數(shù)或字段封送到非托管代碼。
托管代碼 (managed code)
由公共語言運行庫環(huán)境(而不是直接由操作系統(tǒng))執(zhí)行的代碼。托管代碼應(yīng)用程序可以獲得公共語言運行庫服務(wù),例如自動垃圾回收、運行庫類型檢查和安全支持等。這些服務(wù)幫助提供獨立于平臺和語言的、統(tǒng)一的托管代碼應(yīng)用程序行為。
托管代碼是可以使用20多種支持Microsoft .NET Framework的高級語言編寫的代碼,它們包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的語言共享統(tǒng)一的類庫集合,并能被編碼成為中間語言(IL)。運行庫編譯器(runtime-aware compiler)在托管執(zhí)行環(huán)境下編譯中間語言(IL)使之成為本地可執(zhí)行的代碼,并使用數(shù)組邊界和索引檢查,異常處理,垃圾回收等手段確保類型的安全。
在托管執(zhí)行環(huán)境中使用托管代碼及其編譯,可以避免許多典型的導(dǎo)致安全黑洞和不穩(wěn)定程序的編程錯誤。同樣,許多不可靠的設(shè)計也自動的被增強了安全性,例如 類型安全檢查,內(nèi)存管理和釋放無效對象。程序員可以花更多的精力關(guān)注程序的應(yīng)用邏輯設(shè)計并可以減少代碼的編寫量。這就意味著更短的開發(fā)時間和更健壯的程序。
非托管代碼 (unmanaged code)
在公共語言運行庫環(huán)境的外部,由操作系統(tǒng)直接執(zhí)行的代碼。非托管代碼必須提供自己的垃圾回收、類型檢查、安全支持等服務(wù);它與托管代碼不同,后者從公共語言運行庫中獲得這些服務(wù)。
相關(guān)文章
ASP.NET中ListView(列表視圖)的使用前臺綁定附源碼
ListView(列表視圖)想必大家都知道吧,接下來本文將介紹下ListView的使用前臺綁定,感興趣的你可不要錯過本文了哈2013-03-03
asp.net內(nèi)置對象 Response對象使用介紹
這篇文章主要介紹了asp.net內(nèi)置對象:Response對象使用介紹,對Response對象感興趣的小伙伴們可以參考一下2015-11-11
asp.net core2.2多用戶驗證與授權(quán)示例詳解
這篇文章主要給大家介紹了關(guān)于asp.net core2.2多用戶驗證與授權(quán)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01
使用EF Code First搭建簡易ASP.NET MVC網(wǎng)站并允許數(shù)據(jù)庫遷移
這篇文章介紹了使用EF Code First搭建簡易ASP.NET MVC網(wǎng)站并允許數(shù)據(jù)庫遷移的方法,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
ASP.NET WebAPI連接數(shù)據(jù)庫的方法
這篇文章主要為大家詳細介紹了ASP.NET WebAPI連接數(shù)據(jù)庫的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-08-08

