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)了