c#(winform)環(huán)境下使用動(dòng)態(tài)鏈接庫dll的詳解
c#(WinForm)環(huán)境下使用動(dòng)態(tài)鏈接庫dll的詳解

轉(zhuǎn)載? 2016年05月14日 10:12:17
3208
1,什么是dll文件?
DLL(Dynamic Link Library)文件為動(dòng)態(tài)鏈接庫文件,又稱“應(yīng)用程序拓展”,是軟件文件類型。在Windows中,許多應(yīng)用程序并不是一個(gè)完整的可執(zhí)行文件,它們被分割成一些相對獨(dú)立的動(dòng)態(tài)鏈接庫,即DLL文件,放置于系統(tǒng)中。當(dāng)我們執(zhí)行某一個(gè)程序時(shí),相應(yīng)的DLL文件就會(huì)被調(diào)用。一個(gè)應(yīng)用程序可使用多個(gè)DLL文件,一個(gè)DLL文件也可能被不同的應(yīng)用程序使用,這樣的DLL文件被稱為共享DLL文件。
2,托管dll和非托管dll區(qū)別是什么?
托管DLL就是能夠在公共語言運(yùn)行庫(Common Language Runtime,簡稱CLR)中能夠直接引用的,并且擴(kuò)展為“DLL”的文件。具體所指就是封裝各種命名空間所在的DLL文件,如System.dll等。非托管DLL就是平常所的動(dòng)態(tài)鏈接庫等,其中就包括了封裝所有Windows API函數(shù)的DLL文件。各種非托管DLL中的函數(shù)在公共語言運(yùn)行庫中不能直接被調(diào)用,而需要經(jīng)過.Net框架提供的“平臺調(diào)用”服務(wù)后才可以。(簡而言之就是.net環(huán)境下生成的動(dòng)態(tài)鏈接庫為托管dll,相反則為非托管dll)
3,托管dll和非托管dll如何使用?
托管dll在VS環(huán)境下使用相對容易,可以在項(xiàng)目名上右擊選擇添加應(yīng)用的方式導(dǎo)入dll,本文這里不作詳解。非托管dll的使用步驟及如下:
1,需要檢查使用的dll的目標(biāo)平臺(Any Cpu,x86,x64),在項(xiàng)目屬性生成選項(xiàng)卡中選擇與dll相對應(yīng)的目標(biāo)平臺。因?yàn)橥泄躣ll是在.net的環(huán)境下生成的,轉(zhuǎn)換為機(jī)器語言后能夠自動(dòng)識別目標(biāo)平臺即有框架支持解釋,而非托管不能夠自己識別需要人為的設(shè)置。
2,使用DllImport導(dǎo)入非托管dll。
3)、環(huán)境變量目錄。(即需要將dll及依賴文件放到3個(gè)目錄中的任何一個(gè)目錄中)。
4)、必須引入System.Runtime.InteropServices命名空間。
ThrowOnUnmappableChar ? ? 控制對轉(zhuǎn)換為 ANSI '?' 字符的不可映射的 Unicode 字符引發(fā)異常。
4,c#與c++、c動(dòng)態(tài)鏈接庫的參數(shù)如何對應(yīng)?
C C# 備注
short?int16?短整型
int?int32?整型
long?int64?長整型
& ref?取地址
*?ref?指針
c#中修飾符ref、out的作用及功能
ref 要求參數(shù)在傳遞給函數(shù)前要初始化,out則不需要,常見于平臺調(diào)用中。out和ref傳遞的都是引用而不是值,out側(cè)重于輸出使用之前不需賦值而ref在使用之前需要賦值,另外這兩個(gè)關(guān)鍵字可以變相實(shí)現(xiàn)使一個(gè)方法輸出多個(gè)值。ref可以把參數(shù)的數(shù)值傳遞進(jìn)函數(shù),但是out是要把參數(shù)清空,就是說你無法把一個(gè)數(shù)值從out傳遞進(jìn)去的,out進(jìn)去后,參數(shù)的數(shù)值為空,所以你必須初始化一次。這個(gè)就是兩個(gè)的區(qū)別,或者說就像有的網(wǎng)友說的,ref是有進(jìn)有出,out是只出不進(jìn)。說明是引用的傳遞。
example:
//命名空間
using System.Runtime.InteropServices;
//導(dǎo)入非托管dll
//分配的庫處理和連接到數(shù)控指定的IP地址或主機(jī)名。
[DllImport("Fwlib64.dll", EntryPoint = "cnc_allclibhndl3", CallingConvention=CallingConvention.Cdecl)]
//short (const char *ipaddr, unsigned short port, long timeout, unsigned short *FlibHndl)
private static extern Int16 cnc_allclibhndl3(ref String ip, UInt16 port, Int64 timeout, ref UInt16 flibHndl);
在閱讀代碼時(shí),經(jīng)常會(huì)看到函數(shù)聲明的形參會(huì)有_In_和_out_修飾符,_In_和_out_在這里是宏,它們的實(shí)際意思是
_In_ ? ? ? ? ? 表明這個(gè)變量或參數(shù)是輸入值,即你必須給這個(gè)變量填寫好以后提交給某個(gè)函數(shù)去執(zhí)行
_out_ ? ? ? ? 表明這個(gè)是輸出值,即你可以傳個(gè)地址給形參,函數(shù)內(nèi)部會(huì)往這個(gè)地址寫地
這兩個(gè)宏并不會(huì)參與編譯,它僅僅是對程序員起到提示作用,讓程序員明白如何調(diào)用該函數(shù)
類似的宏還有
__out ? ? ? ? ?輸出參數(shù)
__in_opt ? ? 可選的輸入?yún)?shù)
C#
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。