Creating dll plugin in .NET application - 1

Agaknya ini sesuatu yang semua orang sudah tau, tapi saya masukin lagi aja deh :D . Pembuatan Plug-in untuk sebuah aplikasi agar sebuah fitur dapat dijalankan on-the-fly pada saat aplikasi berjalan merupakan sebuah keunggulan bagi aplikasi tertentu, sebut saja winamp dengan visualization pluginsnya, dan windows media player dengan skin pluginsnya, fitur seperti ini tidak hanya terbatas pada tampilan, dan fungsi2 sederhana saja seperti untuk visualization dan skin, bahkan sebuah form dan class pun dapat di load secara on-the-fly di .NET dengan menggunakan fasilitas Loading Assembly yang terdapat pada System.Reflection.

 

Saya akan mencoba untuk membagi pengalaman saya bekerja dengan System.Reflection dalam dua bagian ,yang pertama adalah understanding dynamic loading dan dynamic loading class

 

Pada list kode kita terdapat metadata yang mendeskripsikan type, members dan references, dengan metadata inilah, sebuah class yang dibangun menggunakan VB.NET dapat berkomunikasi dengan baik dengan class yang dibangun dengan C#, karena pada dasarnya metadata ini adalah suatu hal yang sama baik untuk C#, VB.NET maupun J#. .NET Framework menyediakan run-time enviroment yang disebut Common Language Runtime (CLR) yang menjalankan kode dan menyediakan services. Saat membuat desktop application, biasanya kita membiarkan aplikasi yang melakukan loading metadata tersebut, namun terdapat situasi dimana metadata tersebut perlu untuk di load tidak pada saat melakukan loading.

 

Salah satu cara untuk melakukan hal tersebut adalah dengan membuat sebuah Dynamic Link Library (*.dll) yang terpisah dan kemudian dll tersebut di load oleh aplikasi pada saat runtime. Untuk melakukannya kita perlu untuk membuat sebuah “perjanjian” antara dll dan aplikasi, perjanjian tersebut tidak lain berupa sebuah interface class, interface ini harus berada baik pada dll, maupun pada aplikasi. Cara paling elegan untuk melakukannya adalah dengan membuat sebuah interface library (class library yang isinya interface).

 

Marilah kita mulai dengan melakukan dynamic loading methods terlebih dahulu. Yang akan dibuat disini adalah dll yang mengandung message (String) saja, message ini nanti akan diambil dan ditampilkan kelayar. Berikut adalah langkah langkah pembuatannya :

  1. Membuat SimpleInterface library (SimpleInterface.dll)
  2. Membuat SimpleDLL library (SimpleDLL.dll)
  3. Membuat SimpleApp

 

Berikut adalah listing untuk setiap kode beserta dengan penjelasannya, saat SimpleInterface selesai dibuat, jangan lupa untuk menambahkannya sebagai reference pada SimpleDLL & SimpleApp.

  

SimpleInterface.cs di project SimpleInterface.dll

 

using System;

namespace PluginInterface

{

    public interface SimpleInterface

    {

        // Method GetMessage yang hanya berupa Getter saja

        String GetMessage ();

    }

}

 

SimpleDLL.cs di project SimpleDLL.dll

 

using System;

 

namespace SimpleDLL

{

    // class SimpleDLL menginherit SimpleInterface

    public class SimpleDLL : SimpleInterface.SimpleInterface

    {

        // Realisasi dari method Message di SimpleInterface dilakukan disini

        public String GetMessage ()

        {

            return "Simple DLL, Have a Nice Day";

        }

    }

}

 

Form1.cs di SimpleApp – ringkasan bagian untuk menentukan apakah sebuah dll menginherit interface SimpleInterface

 

// lakukan loading dll yang dimaksud

Assembly assembly = Assembly.LoadFile(filename);

 

// iterate satu demi satu type yang terdapat pada dll

foreach (Type type in assembly.GetTypes())

{

    // tampilkan typename

    TextBoxResult.Text = "Type Name : " + type.ToString();

               

    // mencari apakah type memiliki interface "SimpleInterface"

    Type interfacetype =

Type.GetInterface("SimpleInterface.SimpleInterface");

               

    // jike type tidak menginherit simple interface, maka null

    if (interfacetype == null)

    {

       TextBoxResult.Text += "\n Error : Tidak ada type yang

              menginherit Simple Interface";

    }

    else

    {

       TextBoxResult.Text += "\n Type dapat digunakan";

    }

    //bersih2

    interfacetype = null;

}

 

Form1.cs di SimpleApp – ringkasan bagian untuk memanggil method GetMessage

 

// lakukan loading dll yang dimaksud

Assembly assembly = Assembly.LoadFile(filename);

 

// iterate satu demi satu type yang terdapat pada dll

foreach (Type type in assembly.GetTypes())

{

    // Mengambil keterangan method info dari method "Message"

    MethodInfo methodinfo = type.GetMethod("GetMessage");

 

   // membuat instance class Simple DLL dalam bentuk Object

   Object obj = Activator.CreateInstance(type);

                   

   // Memanggil Method Message dari obj

   TextBoxResult.Text += "\n Result : " + methodinfo.Invoke(obj, null);

}

 

Setelah ini, untuk mengujinya, anda mungkin ingin menambahkan beberapa dll seperti simpleDLL dengan message yang berbeda. Tidak sulit khan ?

SimpleInterface.cs di project SimpleInterface.dll

 

using System;

namespace PluginInterface

{

    public interface SimpleInterface

    {

        // Method GetMessage yang hanya berupa Getter saja

        String GetMessage ();

    }

}

 

SimpleDLL.cs di project SimpleDLL.dll

 

using System;

 

namespace SimpleDLL

{

    // class SimpleDLL menginherit SimpleInterface

    public class SimpleDLL : SimpleInterface.SimpleInterface

    {

        // Realisasi dari method Message di SimpleInterface dilakukan disini

        public String GetMessage ()

        {

            return "Simple DLL, Have a Nice Day";

        }

    }

}

 

Form1.cs di SimpleApp – ringkasan bagian untuk menentukan apakah sebuah dll menginherit interface SimpleInterface

 

// lakukan loading dll yang dimaksud

Assembly assembly = Assembly.LoadFile(filename);

 

// iterate satu demi satu type yang terdapat pada dll

foreach (Type type in assembly.GetTypes())

{

    // tampilkan typename

    TextBoxResult.Text = "Type Name : " + type.ToString();

               

    // mencari apakah type memiliki interface "SimpleInterface"

    Type interfacetype =

Type.GetInterface("SimpleInterface.SimpleInterface");

               

    // jike type tidak menginherit simple interface, maka null

    if (interfacetype == null)

    {

       TextBoxResult.Text += "\n Error : Tidak ada type yang

              menginherit Simple Interface";

    }

    else

    {

       TextBoxResult.Text += "\n Type dapat digunakan";

    }

    //bersih2

    interfacetype = null;

}

 

Form1.cs di SimpleApp – ringkasan bagian untuk memanggil method GetMessage

 

// lakukan loading dll yang dimaksud

Assembly assembly = Assembly.LoadFile(filename);

 

// iterate satu demi satu type yang terdapat pada dll

foreach (Type type in assembly.GetTypes())

{

    // Mengambil keterangan method info dari method "Message"

    MethodInfo methodinfo = type.GetMethod("GetMessage");

 

   // membuat instance class Simple DLL dalam bentuk Object

   Object obj = Activator.CreateInstance(type);

                   

   // Memanggil Method Message dari obj

   TextBoxResult.Text += "\n Result : " + methodinfo.Invoke(obj, null);

}

 

Setelah ini, untuk mengujinya, anda mungkin ingin menambahkan beberapa dll seperti simpleDLL dengan message yang berbeda. Tidak sulit khan ?

Btw..kalo ada yang pengen file projectnya, please japri aja ke saya dan informasikan juga anda menggunakan Visual Studio & .NET Framework versi berapa, agar tidak ada kesulitan saat ingin membukanya, nanti saya kirimkan via email

Share this post: | | | |
Published Monday, September 3, 2007 8:36 AM by De_Joker
Filed under:

Comments

# re: Creating dll plugin in .NET application - 1

Thursday, May 15, 2008 11:06 AM by keey

hallo...

perkenalkan saya keey

sedang belajar di salah satu perguruan tinggi komputer di yogyakarta

saya bermaksud untuk memperoleh masukan dari saudara dalam hal GUI merupakan tampilan dari sebuah pesan messages yang dapat di inputkna dalam sebuah aplikasi.....

dfh_akew@yahoo.com

Powered by Community Server (Commercial Edition), by Telligent Systems