1說明:
在C#中,dll是添加 【類庫】生成的。
2添加C#的dll:
(1)在VS中新建一個Windows應用程序項目,并命名為TransferDll。
(2)打開Windows窗體設計器,從工具箱中為窗體添加相應的控件。
(3)在該應用程序的“解決方案資源管理”中的“引用”文件上單擊鼠標右鍵,
在下拉列表中選擇“添加引用”項,在彈出的“添加引用”對話框中選擇“瀏覽”選項卡,
在該選項卡中選擇AccountDll類庫的DLL文件(示例36_02中的AccountDll.dll文件),
單擊“確定”按鈕。完成動態鏈接庫的添加。
(4)在主窗體的加載事件中調用AccountDll類庫的formShow方法,完成登錄窗體的調用。代碼如下:
?AccountDll.Account.public void?formShow(string?TName,?out int?n,?out?string?u)?
"命名空間【AccountDll】對象class【Account】"
AccountDll.Account EncapClass = new AccountDll.Account(); //實例化動態鏈接庫AccountDllprivate void Form1_Load(object sender, EventArgs e)
{int n = 0; //定義變量,用于記錄是否登錄成功string u = ""; //定義變量,用于記錄登錄的用戶名//在動態鏈接庫中記當數據庫的連接字符串"class內,靜態變量"AccountDll.Account.M_str_sqlcon = "Data Source=.;Database=db_36;User id=sa;PWD=";EncapClass.formShow("tb_Logon", out n, out u); //調用登錄窗體if (n == 0) //如果登錄失敗{Close(); //關閉主窗體}else{statusStrip1.Items[2].Text = u; //顯示當前登錄的用戶名}
}
【TName】登錄表的名稱;【n】登錄成功標識;【u】登錄成功的用戶名。
3添加非C#的dll:
在程序開發過程,有時會使用C#調用其他編程語言開發的DLL或調用Windows系統API函數,
由于這些DLL都屬于非托管動態鏈接庫(DLL),要調用非托管動態鏈接庫(DLL)則需要使用DllImport屬性。DllImport屬性指示該屬性化方法由非托管動態鏈接庫(DLL)作為靜態入口點公開,
并提供對從非托管DLL導出的函數進行調用所必需的信息。
作為最低要求,必須提供包含入口點的DLL的名稱。在使用DllImport屬性前,須引用命名空間System.Runtime.InteropServices。下面的示例說明如何使用DllImport屬性調用非托管的DLL。代碼如下:
[DllImport("KERNEL32.DLL", EntryPoint = "MoveFileW", SetLastError = True,
CharSet = CharSet.Unicode, ExactSpelling = True,
CallingConvention = CallingConvention.StdCall)]public static extern bool MoveFile(String src, String dst);
CallingConvention 指示入口點的調用約定
CharSet 指示如何向方法封送字符串參數,并控制名稱重整
EntryPoint 指示要調用的DLL入口點的名稱或序號
PreserveSig 指示簽名是否為非托管入口點的直接轉換
SetLastError 指示被調用方在從屬性化方法返回之前是否調用 SetLastError Win32 API 函數
案例:
using System.Runtime.InteropServices;
namespace DelphiDll
{public partial class Form1 : Form{public class cCdll{[DllImport("projectdll.dll", EntryPoint = "Sum", SetLastError = true, CharSet = CharSet.Unicode, ExactSpelling = true, CallingConvention = CallingConvention.StdCall)]public static extern double Sum(double x, double y);}public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){textBox3.Text = cCdll.Sum(Convert.ToDouble(textBox1.Text), Convert.ToDouble(textBox2.Text)).ToString();}}
}