SỬ DỤNG DLL TRONG NET 14/06/2007 04:49 PM Trong chương trình viết NET, ngồi việc sử dụng thư viện cung cấp NET Framework, có nhu cầu sử dụng hàm viết Windows, hàm API Windows Thông thường, hàm cài đặt thư viện liên kết động (DLL), dịch trình dịch MS Visual C++ hay Borland Delphi Các thư viện phát hành thường gồm tệp, tệp tiêu đề có phần mở rộng h chứa khai báo hàm, tệp thư viện nhập có phần mở rộng lib tệp thư viện liên kết động có phần mở rộng dll Để sử dụng hàm thư viện liên kết động NET, cần tệp dll đủ, ngồi cần tệp h để biết nguyên mẫu hàm, từ khai báo hàm NET cách đắn Trong này, giới thiệu cách sử dụng hàm viết thư viện liên kết động, dịch Visual C++ chương trình viết NET Thư viện minh hoạ học thư viện giới thiệu Thư viện liên kết động, mơn học Lập trình Windows Đây thư viện đơn giản với hai hàm: hàm tính luỹ thừa hàm tính giai thừa Tệp tiêu đề thư viện khai báo sau: /* MyDll.h */ #ifndef MYDLL_H #define MYDLL_H #ifdef MYDLL_EXPORTS #define MYDLLEXPORT _declspec(dllexport) #else #define MYDLLEXPORT _declspec(dllimport) #endifMYDLLEXPORT LONG CALLBACK Factorial(UINT); MYDLLEXPORT DOUBLE CALLBACK Power(DOUBLE, UINT); #endif // MYDLL_H Tệp nguồn thư viện: /* MyDll.c */ #include #include “MyDll.h”LONG CALLBACK Factorial(UINT n) { return (n > 0)?n*Factorial(n - 1):1; }DOUBLE CALLBACK Power(DOUBLE x, UINT n) { return (n > 0)?x*Power(x, n - 1): 1; } Để sử dụng thư viện NET, dùng khai báo hàm với từ khố extern thuộc tính DllImport Chương trình sau khai báo sử dụng hai hàm using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; namespace UsingDll { class Program { [DllImport(”MyDll.dll”)] private static extern int Factorial(int n); [DllImport(”MyDll.dll”)] private static extern double Power(double x, int n); static void Main(string[] args) { Console.WriteLine(”2.0 to power is {0}”, Power(2.0, 3)); Console.WriteLine(”Factorial of is {0}”, Factorial(5)); } } } Một vấn đề thường gặp phải sử dụng hàm viết Windows NET kiểu liệu hai không giống Sau vài kiểu chuyển đổi để gọi hàm cách đắn Kiểu số nguyên byte: Windows: TCHAR (char), BYTE (unsigned char) .NET: sbyte, byte (C#), Byte (VB.NET) Kiểu số nguyên byte: Windows: int, UINT (unsigned int), DWORD (unsigned int), LONG (long) .NET: int (C#), Integer (VB.NET) Int32 Kiểu số thực byte: Windows: float .NET: float (C#), Single (VB.NET) Kiểu số thực byte: Windows: double .NET: double (C#), Double (VB.NET) Kiểu xâu ký tự (vào): Windows: LPCTSTR, LPSTR .NET: string (C#), String (VB.NET) Kiểu xâu ký tự (ra): Windows: LPSTR .NET: byte[], sbyte[] (C#), Byte [] (VB.NET) Ghi chú: - Các hàm DLL phải dịch theo chế độ gọi stdcall Để dịch theo chế độ stdcall, hàm nên khai báo với thị _stdcall (WINAPI, CALLBACK) đặt tệp nguồn có phần mở rộng c Để kiểm tra hàm DLL có sẵn có phải gọi theo kiểu stdcall khơng, mở DLL xem định dạng hàm DLL phải có dạng _@ Ví dụ hai hàm có tên đầy đủ là: _Factorial@4 _Power@12.- Trong trường hợp lấy xâu ký tự từ hàm, cần phải truyền vào mảng kiểu byte (ANSI) char (Unicode) đủ lớn, sau ghép ký tự nhận mảng để tạo thành xâu ký tự kiểu string ...#ifdef MYDLL_EXPORTS #define MYDLLEXPORT _declspec(dllexport) #else #define MYDLLEXPORT _declspec(dllimport) #endifMYDLLEXPORT LONG CALLBACK Factorial(UINT); MYDLLEXPORT DOUBLE CALLBACK... System.Runtime.InteropServices; namespace UsingDll { class Program { [DllImport(”MyDll .dll )] private static extern int Factorial(int n); [DllImport(”MyDll .dll )] private static extern double Power(double... LONG (long) .NET: int (C#), Integer (VB .NET) Int32 Kiểu số thực byte: Windows: float .NET: float (C#), Single (VB .NET) Kiểu số thực byte: Windows: double .NET: double (C#), Double (VB .NET) Kiểu