偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

C#調(diào)用DLL的方法

開發(fā) 后端
本文介紹C#調(diào)用DLL的方法,每種編程語言調(diào)用DLL的方法都不盡相同,首先,您需要了解什么是托管,什么是非托管。

一.C#調(diào)用DLL與應(yīng)用程序

動(dòng)態(tài)鏈接庫(也稱為DLL,即為“Dynamic Link Library”的縮寫)是Microsoft Windows最重要的組成要素之一,打開Windows系統(tǒng)文件夾,你會(huì)發(fā)現(xiàn)文件夾中有很多DLL文件,Windows就是將一些主要的系統(tǒng)功能以DLL模塊的形式實(shí)現(xiàn)。

動(dòng)態(tài)鏈接庫是不能直接執(zhí)行的,也不能接收消息,它只是一個(gè)獨(dú)立的文件,其中包含能被程序或其它DLL調(diào)用來完成一定操作的函數(shù)(方法。注:C#中一般稱為“方法”),但這些函數(shù)不是執(zhí)行程序本身的一部分,而是根據(jù)進(jìn)程的需要按需載入,此時(shí)才能發(fā)揮作用。

DLL只有在應(yīng)用程序需要時(shí)才被系統(tǒng)加載到進(jìn)程的虛擬空間中,成為調(diào)用進(jìn)程的一部分,此時(shí)該DLL也只能被該進(jìn)程的線程訪問,它的句柄可以被調(diào)用進(jìn)程所使用,而調(diào)用進(jìn)程的句柄也可以被該DLL所使用。在內(nèi)存中,一個(gè)DLL只有一個(gè)實(shí)例,且它的編制與具體的編程語言和編譯器都沒有關(guān)系,所以可以通過DLL來實(shí)現(xiàn)混合語言編程。DLL函數(shù)中的代碼所創(chuàng)建的任何對(duì)象(包括變量)都?xì)w調(diào)用它的線程或進(jìn)程所有。

下面列出了當(dāng)程序使用 DLL 時(shí)提供的一些優(yōu)點(diǎn):

1)使用較少的資源

當(dāng)多個(gè)程序使用同一個(gè)函數(shù)庫時(shí),DLL 可以減少在磁盤和物理內(nèi)存中加載的代碼的重復(fù)量。這不僅可以大大影響在前臺(tái)運(yùn)行的程序,而且可以大大影響其他在 Windows 操作系統(tǒng)上運(yùn)行的程序。

2)推廣模塊式體系結(jié)構(gòu)

DLL 有助于促進(jìn)模塊式程序的開發(fā)。這可以幫助您開發(fā)要求提供多個(gè)語言版本的大型程序或要求具有模塊式體系結(jié)構(gòu)的程序。模塊式程序的一個(gè)示例是具有多個(gè)可以在運(yùn)行時(shí)動(dòng)態(tài)加載的模塊的計(jì)帳程序。

3)簡化部署和安裝

當(dāng) DLL 中的函數(shù)需要更新或修復(fù)時(shí),部署和安裝 DLL 不要求重新建立程序與該 DLL 的鏈接。此外,如果多個(gè)程序使用同一個(gè) DLL,那么多個(gè)程序都將從該更新或修復(fù)中獲益。當(dāng)您使用定期更新或修復(fù)的第三方 DLL 時(shí),此問題可能會(huì)更頻繁地出現(xiàn)。

二.DLL的調(diào)用

每種編程語言調(diào)用DLL的方法都不盡相同,在此只對(duì)用C#調(diào)用DLL的方法進(jìn)行介紹。首先,您需要了解什么是托管,什么是非托管。一般可以認(rèn)為:非托管代碼主要是基于win 32平臺(tái)開發(fā)的DLL,activeX的組件,托管代碼是基于.net平臺(tái)開發(fā)的。如果您想深入了解托管與非托管的關(guān)系與區(qū)別,及它們的運(yùn)行機(jī)制,請(qǐng)您自行查找資料,本文件在此不作討論。

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

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

[DLLImport(“DLL文件”)]

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

其中:

DLL文件:包含定義外部方法的庫文件。修飾符: 訪問修飾符,除了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文件中的定義相一致。

若要使用其它函數(shù)名,可以使用EntryPoint屬性設(shè)置,如:
[DllImport("user32.dll", EntryPoint="MessageBoxA")]
static extern int MsgBox(int hWnd, string msg, string caption, int type);

其它可選的 DllImportAttribute 屬性:
◆CharSet 指示用在入口點(diǎn)中的字符集,如:CharSet=CharSet.Ansi;
◆SetLastError 指示方法是否保留 Win32"上一錯(cuò)誤",如:SetLastError=true;
◆ExactSpelling 指示 EntryPoint 是否必須與指示的入口點(diǎn)的拼寫完全匹配,如:ExactSpelling=false;
◆PreserveSig指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換, 如:PreserveSig=true;
◆CallingConvention指示入口點(diǎn)的調(diào)用約定, 如:CallingConvention=CallingConvention.Winapi;

【編輯推薦】

  1. 淺談C#中構(gòu)造函數(shù)和成員函數(shù)
  2. C#函數(shù)的參數(shù)返回結(jié)構(gòu)數(shù)組
  3. 概述ASP.NET中的NGWS Runtime
  4. C#函數(shù)與JavaScript函數(shù)
  5. 詳解C# Object.Equals函數(shù)
責(zé)任編輯:佚名 來源: IT168
相關(guān)推薦

2009-08-05 09:40:02

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

2009-08-05 09:30:39

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

2011-04-08 09:52:44

C++C#DLL

2009-08-07 17:22:36

C#調(diào)用dll導(dǎo)出函數(shù)

2009-07-31 17:28:35

C#語言調(diào)用DLL

2009-08-05 17:06:39

ASP調(diào)用C# DLL

2009-09-02 17:16:01

冒泡排序

2009-08-05 16:41:36

C#調(diào)用VC dll

2009-08-05 15:04:14

C# dll注入

2009-08-05 16:49:42

C#中調(diào)用dll

2009-08-05 09:09:14

C#調(diào)用VC DLL接

2009-08-05 09:22:43

C#調(diào)用VC DLL

2009-08-31 18:05:14

C#調(diào)用WalkTre

2009-08-31 16:33:28

C#調(diào)用Dispose

2010-06-17 11:51:20

java.net DLLC#

2011-03-31 09:13:00

Visual Stud

2009-09-01 11:04:59

C#調(diào)用擴(kuò)展方法

2024-03-01 20:59:11

C#DLL開發(fā)

2024-05-16 12:33:37

C#編程指針

2009-07-31 14:54:48

dll函數(shù)C#導(dǎo)出
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)