C#中如何調(diào)用DLL函數(shù)

C#中如何調(diào)用DLL函數(shù),針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、三沙網(wǎng)絡(luò)推廣、成都微信小程序、三沙網(wǎng)絡(luò)營(yíng)銷、三沙企業(yè)策劃、三沙品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營(yíng)等,從售前售中售后,我們都將竭誠(chéng)為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供三沙建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:bm7419.com

首先,理解托管代碼與非托管代碼的區(qū)別:

1.托管代碼所申請(qǐng)的資源統(tǒng)一由.Net Framework管理,你不用操心,非托管代碼所申請(qǐng)的內(nèi)存等資源則需要你手動(dòng)去釋放  

2.非托管程序運(yùn)行會(huì)很快,是二進(jìn)制的,托管程序好寫(xiě),但是速度就差的很多,資源會(huì)用的很多

3.“程序"一般都是在對(duì)操作系統(tǒng)進(jìn)行直接或者間接的操作  

"托管程序"是需要通過(guò)訪問(wèn)公共語(yǔ)言運(yùn)行時(shí)(cls)才能訪問(wèn)操作系統(tǒng)的程序,而“非托管程序”不用通過(guò)訪問(wèn)公共語(yǔ)言運(yùn)行時(shí)(cls)可以直接訪問(wèn)操作系統(tǒng)的程序  

4.vb.net,C#等寫(xiě)的程序是托管程序,VC++可以寫(xiě)托管程序,如果用到了內(nèi)存管理,則只能編譯為非托管程序

VC++寫(xiě)托管的是要用.net的庫(kù),因?yàn)槲覀儧](méi)有用.net,所以只用了非托管方式。

(一) C#調(diào)用DLL中的非托管函數(shù)一般方法

首先,應(yīng)該在C#語(yǔ)言源程序中聲明外部方法,其基本形式是:

[DLLImport(“DLL文件”)]

修飾符 extern 返回變量類型 方法名稱 (參數(shù)列表)

其中:

DLL文件:包含定義外部方法的庫(kù)文件。

修飾符: 訪問(wèn)修飾符,除了abstract以外在聲明方法時(shí)可以使用的修飾符。

返回變量類型:在DLL文件中你需調(diào)用方法的返回變量類型。

方法名稱:在DLL文件中你需調(diào)用方法的名稱。

參數(shù)列表:在DLL文件中你需調(diào)用方法的列表。

注意:需要在程序聲明中使用System.Runtime.InteropServices命名空間。

DllImport只能放置在方法聲明上。

DLL文件必須位于程序當(dāng)前目錄或系統(tǒng)定義的查詢路徑中(即:系統(tǒng)環(huán)境變量中Path所設(shè)置的路徑)。

返回變量類型、方法名稱、參數(shù)列表一定要與DLL文件中的定義相一致。

其它可選的 DllImportAttribute 屬性:

CharSet 指示用在入口點(diǎn)中的字符集,如:CharSet=CharSet.Ansi;

SetLastError 指示方法是否保留 Win32"上一錯(cuò)誤",如:SetLastError=true;

ExactSpelling 指示 EntryPoint 是否必須與指示的入口點(diǎn)的拼寫(xiě)完全匹配,如:ExactSpelling=false;

PreserveSig指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換, 如:PreserveSig=true;

CallingConvention指示入口點(diǎn)的調(diào)用約定, 如:CallingConvention=CallingConvention.Winapi;

此外,關(guān)于“數(shù)據(jù)封送處理”及“封送數(shù)字和邏輯標(biāo)量”請(qǐng)參閱其它一些文章。

舉例:

New file,選擇visual C# Class。在文件中,創(chuàng)建一個(gè)public的類。把待測(cè)試的函數(shù)在這個(gè)類中作聲明。

public class ClassName      {            [DllImport("xxx.dll", EntryPoint = "xx")]           public static extern int StartVideo(int nDevNum, int SwitchingChans, IntPtr Main, IntPtr hwndPreview);   }

Xxx為待測(cè)試的dll名稱,xx為dll中提供的方法函數(shù)。若要使用其它函數(shù)名,可以使用EntryPoint屬性設(shè)置。

如何用DllImport調(diào)用DLL中的非托管函數(shù),但是這個(gè)是全局的函數(shù),假若DLL中的非托管函數(shù)有一個(gè)靜態(tài)變量S,每次調(diào)用這個(gè)函數(shù)的時(shí)候,靜態(tài)變量S就自動(dòng)加1。結(jié)果,當(dāng)需要重新計(jì)數(shù)時(shí),就不能得出想要的結(jié)果。所以,要注意啊,用DllImport調(diào)用DLL中的非托管函數(shù)是全局的、靜態(tài)的函數(shù)。

關(guān)于C#中如何調(diào)用DLL函數(shù)問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

網(wǎng)頁(yè)題目:C#中如何調(diào)用DLL函數(shù)
轉(zhuǎn)載注明:http://bm7419.com/article30/psdipo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、服務(wù)器托管網(wǎng)站設(shè)計(jì)公司、企業(yè)網(wǎng)站制作動(dòng)態(tài)網(wǎng)站、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)