Tạo file DLL trong C#

Hôm nay tôi xin giới thiệu với mọi người về cách tổ chức chương trình bằng cách tạo ra file DLL trong Visual C++ 2005.

Dynamic Link Library – DLL (Thư viện liên kết động)

DLL là một thư viện chứa các hàm và dữ liệu mà có thể sử dụng bởi nhiều ứng dụng khác nhau ở cùng một thời điểm. Khi đã được viết và đóng gói trong một DLL, một hàm có thể được sử dụng ở bất cứ ứng dụng nào dưới dạng mã máy của nó mà không phải quan tâm đến mã nguồn nó được viết chi tiết ra sao.
Các DLL là một hay nhiều module được chia ra từ một chương trình, nhằm mục đích reuse code.

1. Ưu điểm

Giảm không gian sử dụng bộ nhớ:
Do hàm và dữ liệu trong các DLL được chia sẻ bởi các ứng dụng dùng nó. Ví dụ: Các ứng dụng Winword, Excel, Internet Explorer sẽ chia sẻ chung một phương thức print() đã được biên dịch thành mã máy để trong một dll nào đó. Điều đó dẫn đến các ứng dụng sẻ chỉ phải các hàm này khi nào cần dùng đến (giảm được dung lượng bộ nhớ của chương trình).
Hơn nữa mã trong dll nằm trong khu vực chỉ cho đọc và được nạp(load) vào các trang được đánh dấu chỉ đọc (read-only). Nó cho phép hệ thống tham chiếu DLL vào không gian địa chỉ nhớ của các tiến trình sử dụng nó. Và như vậy, DLL chỉ cần nạp một lần, và nếu một tiến trình sử dụng nó, hệ thống chỉ việc tham chiếu tới không gian lưu trữ địa chỉ nhớ của DLL (Giảm không gian sử dụng bộ nhớ).

Lập trình module
Khi được xây dựng một DLL với các chức năng hợp lý, ta có thể sử dụng nó trong bất cứ ứng dụng nào mà ta cảm thấy thích hợp. Thay vì sẽ phải viết lại hay copy and paste code của cùng một chức năng ở các chương trình khác nhau ta chỉ cần tạo ra chức năng đó 1 lần sau đó build thành dll để cho các chương trình tham chiếu đến để sử dụng. Ví dụ như chức năng MessageBox trong windows chẳng hạn, thay vì mỗi chương trình trong windows ta phải tạo ra MessageBox thì lúc này ta chỉ cần tham chiếu đến thư viện user32.dll và thực thi hàm MessageBox.

Dễ dàng trong quá trình triển khai ứng dụng
Trong quá trình triển khai ứng dụng việc phải sửa lại chương trình do yêu cầu của khách hàng hay do lỗi hệ thống hoặc lập trình là điều rất dễ xảy ra. Nhất là với những chương trình đã cài đặt được một thời gian và cung cấp cho những khách hàng ở xa. Thì việc đóng gói và phân phối lại toàn bộ sản phẩm cho khách hàng là điều hết sức khó khăn. Tuy nhiên nếu chương trình của chúng ta phát triển theo hướng xây dựng các module và build trong các dll thì chúng ta chỉ cần phát hiện module nào bị lỗi. Sau đó thay đổi và đóng gói dll chứa module đó và gửi tới cho khách hàng cập nhập.

2. Hạn chế của DLL
Mặc dù DLL có khá nhiều ưu điểm như trên tuy nhiên nó cũng tồn tại khá nhiều hạn chế.
DLL Hell
Địa ngục DLL là khó khăn lớn nhất thỉnh thoảng gặp khi dùng dll. Các lỗi có thể xảy ra như một số chương trình đã nạp lên nhưng không thể khởi động được hoặc một số chương trình đang hoạt động bình thường bỗng nhiên bị trục trặc khi ta cài đặt mới một ứng dụng. Nguyên nhân cơ bản của sự cố trên là do chương trình cài đặt không kiểm tra phiên bản của các DLL trước khi sao lưu nó vào trong thư mục hệ thống. Khi một DLL mới thay thế một DLL cũ đã có sẵn, nếu DLL này có nhiều thay đổi hoặc không tương thích với các chương trình sử dụng phiên bản cũ nó sẽ gây ra lỗi ở chương trình đó.

Cài đặt, gỡ bỏ
Do một chương trình có thể được chia thành nhiều component nên thay vì ta chỉ phải đăng ký với hệ thống 1 lần duy nhất nay ta sẽ phải đăng ký thành nhiều lần với hệ thống. Hơn nưa khi gỡ bỏ phần mềm cũng sẽ gặp khó khăn rất nhiều do một dll có thể chia sẻ bởi nhiều ứng dụng.

Có bạn nào mà đang sử dụng WMP 11 ko? Nếu như máy của bạn là đời cổ, mà khi đang sử dụng WMP11 sẽ có thông báo lỗi là: wmsetup.dll bị lỗi. Đó là do không đúng phiên bản hoặc là do nó bị lỗi về Dll đấy. Còn những bạn sử dụng máy đời mới thì đương nhiên mình không nói làm gỉ cả. Nhưng sau khi đọc bài viết này, chắc các bạn sẽ biết rõ hơn về DLL.

Bây giờ tôi sẽ thử viết một chương trình về DLL.

Bước 1: Mở Visual Studio và tạo mới project loại : Class Library
Bước 2: Tạo Class để dùng sau này ví dụ:

namespace SampleLibrary
{
    public class 
ToanHoc
    
{
        public 
double Cong(double xdouble y)
        {
            return 
y;
        }
        public 
double Tru(double xdouble y)
        {
            return 
y;
        }
        public 
double Nhan(double xdouble y)
        {
            return 
y;
        }
        public 
double Chia(double xdouble y)
        {
            return 
y;
        }
    }

Bước 3:
Compile Project đó:
_Click Build->Build Project Name(F6)
Bước 4:
_Tạo mới 1 project khác.(Console hoặc Winform hoặc ASP.NET).
_Trong bảng Solution bạn Click phải chuột vào tên project và chọn Add Reference.
_Trong bảng Add reference này bạn vào Tab Browse, tìm đến thư mục Bin->Chọn file .Dll mà các bạn đã build trong project library trước rồi OK.
_Sẽ thấy thư viện mà các bạn chọn nằm trong mục References của Project là thành công.
Bước 5: Gọi các phương thức trong thư viện DLL. Sử dụng Using tên library

Using SampleLibrary 

ToanHoc th = new ToanHoc();
            
double ab;
            
double c;
            
5.4;
            
6.5;
            
th.Cong(a,b);
            
Console.WriteLine(c);
            
Console.ReadLine(); 

Hoặc cách sử dụng khác chi tiết hơn:

using System.SampleLibrary  ;  // thêm dòng này nè

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            int a=25;
            int b =10;
            Console.WriteLine("{0} + {1} = {2}", a, b, Toanhoc.Cong(a, b));
            Console.WriteLine("{0} - {1} = {2}", a, b, Toanhoc.Tru(a, b));
            Console.WriteLine("{0} * {1} = {2}", a, b, Toanhoc.Nhan(a, b));
            Console.WriteLine("{0} / {1} = {2}", a, b, Toanhoc.Chia(a, b));
        }
    }
}

Sau đó thì chạy chương trình