Danh mục

Sử dụng DLL trong .NET

Số trang: 4      Loại file: doc      Dung lượng: 31.50 KB      Lượt xem: 15      Lượt tải: 0    
Thu Hiền

Hỗ trợ phí lưu trữ khi tải xuống: miễn phí Tải xuống file đầy đủ (4 trang) 0
Xem trước 0 trang đầu tiên của tài liệu này:

Thông tin tài liệu:

Trong các chương trình viết trên nền .NET, ngoài việc sử dụngbộ thư viện được cung cấp bởi .NET Framework, đôi khi chúngta có nhu cầu sử dụng các hàm được viết trên nền Windows,như các hàm API của Windows. Thông thường, các hàm nàyđược cài đặt trong các thư viện liên kết động (DLL), được dịchbằng một trình dịch nào đó như MS Visual C++ hay BorlandDelphi.
Nội dung trích xuất từ tài liệu:
Sử dụng DLL trong .NETSỬ DỤNG DLL TRONG .NET 14/06/2007 04:49 PMTrong các chương trình viết trên nền .NET, ngoài việc sử dụngbộ thư viện được cung cấp bởi .NET Framework, đôi khi chúngta có nhu cầu sử dụng các hàm được viết trên nền Windows,như các hàm API của Windows. Thông thường, các hàm nàyđược cài đặt trong các thư viện liên kết động (DLL), được dịchbằng một trình dịch nào đó như MS Visual C++ hay BorlandDelphi.Các thư viện khi phát hành thường gồm 3 tệp, tệp tiêu đề có phầnmở rộng .h chứa khai báo các hàm, tệp thư viện nhập có phần mởrộng .lib và tệp thư viện liên kết động có phần mở rộng .dll.Để sử dụng các hàm của thư viện liên kết động trong .NET, chỉ cầntệp .dll là đủ, ngoài ra còn cần tệp .h để biết nguyên mẫu các hàm,từ đó khai báo các hàm trong .NET một cách đúng đắn.Trong bài này, tôi giới thiệu cách sử dụng các hàm viết trong một thưviện liên kết động, được dịch bằng Visual C++ trong một chươngtrình viết trên nền .NET. Thư viện minh hoạ trong bài học này là thưviện đã được giới thiệu trong bài Thư viện liên kết động, môn họcLập trình Windows. Đây là một thư viện đơn giản với hai hàm: hàmtính luỹ thừa và hàm tính giai thừa.Tệp tiêu đề của thư viện được khai báo như 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ệpnguồncủathư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ụngthưviệnnàytrong.NET,dùngkhaibáohàmvớitừkhoáexternvàthuộctínhDllImport.Chươngtrìnhsausẽkhaibáovàsửdụnghaihàmnày.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 3 is {0}”, Power(2.0, 3)); Console.WriteLine(”Factorial of 5 is {0}”, Factorial(5)); } }}MộttrongnhữngvấnđềthườnggặpphảikhisửdụnghàmviếttrênnềnWindowstrong.NETlàkiểudữliệugiữahainềnkhônggiốngnhau.Sauđâylàmộtvàikiểuchuyểnđổiđểcóthểgọihàmmộtcáchđúngđắn.Kiểu số nguyên 1 byte:Windows: TCHAR (char), BYTE (unsigned char)..NET: sbyte, byte (C#), Byte (VB.NET).Kiểu số nguyên 4 byte:Windows: int, UINT (unsigned int), DWORD (unsigned int), LONG(long)..NET: int (C#), Integer (VB.NET) hoặc Int32.Kiểu số thực 4 byte:Windows: float..NET: float (C#), Single (VB.NET)Kiểu số thực 8 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 trong DLL phải được dịch theo chế độ gọi stdcall. Để dịchtheo chế độ stdcall, các hàm nên khai báo với chỉ thị _stdcall(WINAPI, CALLBACK) và đặt các tệp nguồn có phần mở rộng là .c.Để kiểm tra một hàm trong một DLL có sẵn có phải được gọi theokiểu stdcall không, mở DLL và xem định dạng của hàm trong DLLphải có dạng _@. Ví dụ hai hàm trênsẽ có tên đầy đủ là: _Factorial@4 và _Power@12.- Trong trườnghợp lấy xâu ký tự ra từ hàm, cần phải truyền vào một mảng kiểubyte (ANSI) hoặc char (Unicode) đủ lớn, sau đó ghép các ký tự nhậnđược trong mảng để tạo thành xâu ký tự kiểu string.

Tài liệu được xem nhiều: