欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# 調(diào)用dll的幾種方式

 更新時(shí)間:2025年07月07日 09:16:25   作者:愛玩厄加特的瑞文  
動(dòng)態(tài)鏈接庫(kù)是Windows系統(tǒng)中實(shí)現(xiàn)功能模塊化的文件,可動(dòng)態(tài)加載以減少內(nèi)存占用并便于更新,下面就來(lái)介紹一下c# 調(diào)用dll的幾種方式,感興趣的可以了解一下

一、什么叫動(dòng)態(tài)鏈接庫(kù)?

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

動(dòng)態(tài)鏈接庫(kù)是不能直接執(zhí)行的,也不能接收消息,他是一個(gè)獨(dú)立的文件,DLL 文件通常包含函數(shù)、類、變量和其他資源,可以被程序動(dòng)態(tài)加載并調(diào)用。

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í)例,且它的編制與具體的編程語(yǔ)言和編譯器都沒有關(guān)系,所以可以通過DLL來(lái)實(shí)現(xiàn)混合語(yǔ)言編程。DLL函數(shù)中的代碼所創(chuàng)建的任何對(duì)象(包括變量)都?xì)w調(diào)用它的線程或進(jìn)程所有。

通過使用 DLL,程序可以在運(yùn)行時(shí)動(dòng)態(tài)鏈接到需要的函數(shù)或資源,而不需要將所有功能都靜態(tài)地包含在可執(zhí)行文件中。這樣可以減少程序的內(nèi)存占用,提高系統(tǒng)的效率。此外,當(dāng)需要更新某個(gè)功能時(shí),只需替換 DLL 文件而不必修改整個(gè)程序。

二、使用DLL優(yōu)點(diǎn):

1.使用較少的資源

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

3.簡(jiǎn)化安裝和部署

三、DLL調(diào)用

1.使用DllImport特性:

這是用于調(diào)用非托管 DLL 的一種方式。你需要聲明一個(gè)靜態(tài) extern 方法,在方法上應(yīng)用 DllImport 特性指定 DLL 文件的名稱。這種方式適用于調(diào)用其他語(yǔ)言(例如C++)書寫的dll。

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

[DllImport("DLL文件")]

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

using System;
using System.Runtime.InteropServices;

class Program
{
    [DllImport("YourDllName.dll")]
    public static extern void YourFunctionName();
}

注意:需要在程序聲明中使用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);

若要設(shè)置字符格式,可以使用CharSet = CharSet.Unicode如:

[DllImport("cbbofspecmedia.dll",CharSet = CharSet.Unicode)]
public static extern int nGetSpecMediaInfoParseExp(byte[] filePath, ExportCbbCallback callback);

通常,c++ dll庫(kù)字符編碼方式都為utf-8,c#調(diào)用dll時(shí),若遇到中文字符的接收與傳遞,會(huì)出現(xiàn)中文字符顯示亂碼與無(wú)法傳遞。

由于.NET平臺(tái)多采用Unicode字符集,可能為gb2312,utf-16等;若此時(shí)對(duì)接收到的參數(shù),做utf-8到Unicode的轉(zhuǎn)換,仍不能得到正確結(jié)果;同樣,對(duì)參數(shù)進(jìn)行Unicode到utf-8的轉(zhuǎn)換,也不能正確傳遞數(shù)據(jù)。
原因在于從dll獲取到的char已經(jīng)隱式轉(zhuǎn)換成為了string,由于utf-8與Unicode漢字編碼字節(jié)數(shù)的不一致,導(dǎo)致隱式轉(zhuǎn)換出錯(cuò),之后再進(jìn)行轉(zhuǎn)換便不能得到正確結(jié)果。

解決辦法:

在C#中,將string,轉(zhuǎn)為byte[] 傳給dll,(因?yàn)閟tring就是一個(gè)byte[])。

string path = @"D:\workingDocument\視頻\video.mp4";
Byte[] bytePath = Encoding.UTF8.GetBytes(path);
int v = cbb.nGetSpecMediaInfoParseExp(bytePath, (a,b)=>{
     int aa = a;
     string bb = b;           
});

2.調(diào)用托管的DLL

C#調(diào)用托管DLL是很簡(jiǎn)單的,(一般適用于C#語(yǔ)言書寫的dll)。右鍵點(diǎn)擊項(xiàng)目 -> 添加 -> 引用 -> 瀏覽,選擇你要添加的 DLL 文件。然后在代碼中直接調(diào)用 DLL 中的方法即可,最后需要用using導(dǎo)入相關(guān)的命名空間。

到此這篇關(guān)于c# 調(diào)用dll的幾種方式的文章就介紹到這了,更多相關(guān)c# 調(diào)用dll內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論