[DLL] Sử dụng DLL trong C#

Trong các bài trước chúng ta đã tìm hiểu cách sử dụng DLL trong project C++.

Các bạn có thể xem lại các bài viết:

Cách tạo DLL trong visual studio : Tạo DLL trong visual studio C++

Sử dụng DLL  trong visual C++ (Load-time dynamic linking) : Sử dụng DLL trong visual C ++ (P1)

Sử dụng DLL trong víual C++ ( Run-time dynamic linking) : Sử dụng DLL trong visual C++ (P2)

Trong bài viết này chúng ta sẽ cùng tìm hiểu về cách sử dụng DLL trong project C#.

Trước khi sử dụng DLL trong project C# chúng ta cùng tìm hiểu qua về khái niệm “Managed” DLL và “Unmanaged” DLL.

Managed code

  • Là code được biên dịch ra mã IL (Intermediate Language) và được quản lý bới CLR (Common Language Runtime)
  • CLR là máy ảo của .NET Framework quản lý các chương trình .NET
  • Managed code export ra “Managed” DLL.

Unmanaged code

  • Là code Không được biên dịch ra mã IL mà nó được biên dịch trực tiếp ra mã máy hay native language.
  • Không được quản lý bởi CLR.
  • Unmanaged code export ra “Unmanaged” DLL.

Khi tạo DLL trong visual studio ta có thể check DLL đó có support CLR hay ko.

Check CLR support khi tạo DLL Visual Studio

Sử dụng “Managed” DLL và “Unmanaged” DLL trong C#:

Với “Managed” DLL chạy trên môi trường máy ảo CLR nên ta có thể add reference trực tiếp vào Project C# để sử dụng.

Với “Unmanaged” DLL không chạy trên mỗi trường máy ảo CLR nên ta không thể add reference trực tiếp, một cách đơn giản để sử dụng “Unmanaged” DLL là dùng P/Invoke (Platform Invoke).

Trong bài viết này chúng ta sẽ tìm hiểu về cách sử dụng P/Invoke. Các API của DLL sẽ được sử dụng qua [DllImport] attribute.

Xét ví dụ:


using System;

using System.Runtime.InteropServices;

namespace UsingDLLCSharpExample

{

   class Program

   {

      [DllImport("DLL.dll"]
      public static extern int Add(int a, int b);

      [DllImport("DLL.dll")]
      public static extern int Sub(int a, int b);

      [DllImport("DLL.dll")]
      public static extern int Mul(int a, int b);

      [DllImport("DLL.dll")]
      public static extern float Div(int a, int b);

      static void Main(string[] args)

      {

         try

         {

            int number1, number2;

            Console.Write("Enter number 1 = ");

            number1 = int.Parse(Console.ReadLine());

            Console.Write("Enter number 2 = ");

            number2 = int.Parse(Console.ReadLine());

            Console.WriteLine("Tong = {0}", Add(number1, number2));

            Console.WriteLine("Hieu = {0}", Sub(number1, number2));

            Console.WriteLine("Tich = {0}", Mul(number1, number2));

            Console.WriteLine("Thuong = {0}", Div(number1, number2));

         }

         catch (Exception ex)

         {

            Console.WriteLine(ex.Message);

         }

         Console.WriteLine("Press any to exit!");

         Console.ReadKey();

      }

   }

}

Khi sử dụng P/Invoke thì hàm khai báo trong C# phải cùng tên với API trong DLL. Nếu ta muốn đặt tên khác khi sử dụng ta dùng EntryPoint.

Ví dụ :

//EntryPoint là hàm Add trong DLL
//Hàm Cong sẽ có chức năng giống hàm Add trong DLL
[DllImport("DLL.dll", EntryPoint ="Add")]
public static extern int Cong(int a, int b);

Chú ý:

  • DLL sử dụng trong DllImport phải được buil ra C Interface.
  • Nên tạo project Class Library trong C# để Wrap Unmanaged DLL. Sau đó sử dụng trực tiếp DLL đã Wrap trong project C#.

Leave A Comment?