C#dll

title: 'C#dll'
date: 2015-12-13 16:11:20
categories: 學(xué)習(xí)C#的過程
tags: C#


需求

在使用C#的時(shí)候我們經(jīng)常需要借助第三方的庫(kù)问窃,調(diào)用dll之類的既棺,那怎么調(diào)用別人提供的dll尼,
而且有些dll是用C語言寫的宣蔚,有些使用C++寫的该编,有些是系統(tǒng)提供的迄本,它們的調(diào)用顯然不一樣,
而且調(diào)用dll很重要课竣,今天我就來總結(jié)一下嘉赎,用法好了置媳。

開始

在C#程序設(shè)計(jì)中使用Win32類庫(kù)

通過C#中的DllImport直接調(diào)用這些功能。

DllImport所在的名字空間 using System.Runtime.InteropServices
namespace System.Runtime.InteropServices
{
  [AttributeUsage(AttributeTargets.Method)]
  public class DllImportAttribute: System.Attribute
  {
   public DllImportAttribute(string dllName) {...}
   public CallingConvention CallingConvention;
   public CharSet CharSet;
   public string EntryPoint;
   public bool ExactSpelling;
   public bool PreserveSig;
   public bool SetLastError;
   public string Value { get {...} }
  }
}

說明:
  1公条、DllImport只能放置在方法聲明上拇囊。
  2、DllImport具有單個(gè)定位參數(shù):指定包含被導(dǎo)入方法的 dll 名稱的 dllName 參數(shù)靶橱。
  3寥袭、DllImport具有五個(gè)命名參數(shù):
   a、CallingConvention 參數(shù)指示入口點(diǎn)的調(diào)用約定关霸。如果未指定 CallingConvention传黄,則使用默認(rèn)值 CallingConvention.Winapi。
   b队寇、CharSet 參數(shù)指示用在入口點(diǎn)中的字符集膘掰。如果未指定 CharSet,則使用默認(rèn)值 CharSet.Auto佳遣。
   c识埋、EntryPoint 參數(shù)給出 dll 中入口點(diǎn)的名稱。如果未指定 EntryPoint零渐,則使用方法本身的名稱窒舟。
   d、ExactSpelling 參數(shù)指示 EntryPoint 是否必須與指示的入口點(diǎn)的拼寫完全匹配诵盼。如果未指定 ExactSpelling惠豺,則使用默認(rèn)值 false。
   e拦耐、PreserveSig 參數(shù)指示方法的簽名應(yīng)當(dāng)被保留還是被轉(zhuǎn)換耕腾。當(dāng)簽名被轉(zhuǎn)換時(shí)见剩,它被轉(zhuǎn)換為一個(gè)具有 HRESULT 返回值和該返回值的一個(gè)名為 retval 的附加輸出參數(shù)的簽名杀糯。如果未指定 PreserveSig,則使用默認(rèn)值 true苍苞。
   f固翰、SetLastError 參數(shù)指示方法是否保留 Win32"上一錯(cuò)誤"。如果未指定 SetLastError羹呵,則使用默認(rèn)值 false骂际。
  4、它是一次性屬性類冈欢。
  5歉铝、此外,用 DllImport 屬性修飾的方法必須具有 extern 修飾符凑耻。
DllImport的用法:
DllImport("MyDllImport.dll")]
private static extern int mySum(int a,int b);

C# 中調(diào)用C++代碼

在C#調(diào)用C++ DLL封裝庫(kù)時(shí)會(huì)出現(xiàn)兩個(gè)問題:

1. 數(shù)據(jù)類型轉(zhuǎn)換問題
2. 指針或地址參數(shù)傳送問題

首先是數(shù)據(jù)類型轉(zhuǎn)換問題太示。因?yàn)镃#是.NET語言柠贤,利用的是.NET的基本數(shù)據(jù)類型,所以實(shí)際上是將C++的數(shù)據(jù)類型與.NET的基本數(shù)據(jù)類型進(jìn)行對(duì)應(yīng)类缤。

例如C++的原有函數(shù)是:
FunctionName(unsigned char param1, unsigned short param2)

    其中的參數(shù)數(shù)據(jù)類型在C#中臼勉,必須轉(zhuǎn)為對(duì)應(yīng)的數(shù)據(jù)類型。如:

[DllImport(“ COM DLL path/file ”)]
extern static int FunctionName(byte param1, ushort param2)

    因?yàn)檎{(diào)用的是__stdcall函數(shù)餐弱,所以使用了P/Invoke的調(diào)用方法宴霸。其中的方法FunctionName必須聲明為靜態(tài)外部函數(shù),即加上extern static聲明頭膏蚓。我們可以看到瓢谢,在調(diào)用的過程中,unsigned char變?yōu)榱薭yte降允,unsigned short變?yōu)榱藆short恩闻。變換后,參數(shù)的數(shù)據(jù)類型不變剧董,只是聲明方式必須改為.NET語言的規(guī)范幢尚。

    我們可以通過下表來進(jìn)行這種轉(zhuǎn)換:
Win32 Types
CLR Type

char, INT8, SBYTE, CHAR
System.SByte

short, short int, INT16, SHORT
System.Int16

int, long, long int, INT32, LONG32, BOOL , INT
System.Int32

__int64, INT64, LONGLONG
System.Int64

unsigned char, UINT8, UCHAR , BYTE
System.Byte

unsigned short, UINT16, USHORT, WORD, ATOM, WCHAR , __wchar_t
System.UInt16

unsigned, unsigned int, UINT32, ULONG32, DWORD32, ULONG, DWORD, UINT
System.UInt32

unsigned __int64, UINT64, DWORDLONG, ULONGLONG
System.UInt64

float, FLOAT
System.Single

double, long double, DOUBLE
System.Double

c#調(diào)用托管的dll

方法:1.添加引用
右擊項(xiàng)目-添加引用-瀏覽 找到本地的dll文件
2.using 該dll文件里面代碼的名稱空間
然后就可以調(diào)用dll文件里面的類(test)和方法(add)了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市翅楼,隨后出現(xiàn)的幾起案子尉剩,更是在濱河造成了極大的恐慌,老刑警劉巖毅臊,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件理茎,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡管嬉,警方通過查閱死者的電腦和手機(jī)皂林,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蚯撩,“玉大人础倍,你說我怎么就攤上這事√タ妫” “怎么了沟启?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)犹菇。 經(jīng)常有香客問我德迹,道長(zhǎng),這世上最難降的妖魔是什么揭芍? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任胳搞,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肌毅。我一直安慰自己币厕,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布芽腾。 她就那樣靜靜地躺著旦装,像睡著了一般。 火紅的嫁衣襯著肌膚如雪摊滔。 梳的紋絲不亂的頭發(fā)上阴绢,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音艰躺,去河邊找鬼呻袭。 笑死,一個(gè)胖子當(dāng)著我的面吹牛腺兴,可吹牛的內(nèi)容都是我干的左电。 我是一名探鬼主播,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼页响,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼篓足!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起闰蚕,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤栈拖,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后没陡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涩哟,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年盼玄,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贴彼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡埃儿,死狀恐怖器仗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蝌箍,我是刑警寧澤青灼,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布暴心,位于F島的核電站妓盲,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏专普。R本人自食惡果不足惜悯衬,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧筋粗,春花似錦策橘、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至买决,卻和暖如春沛婴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背督赤。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來泰國(guó)打工嘁灯, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人躲舌。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓丑婿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親没卸。 傳聞我的和親對(duì)象是個(gè)殘疾皇子羹奉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容