Apa itu Assembly Di .NET?


Unit deployment pada Java adalah sebuah file JAR (atau WAR/EAR untuk Java EE). Pada .NET, unit deployment disebut dengan assembly (ini sama sekali tidak ada hubungannya dengan bahasa mesin). Bentuk fisiknya dapat berupa file EXE atau DLL. Berbeda dengan file EXE/DLL pada umumnya, assembly untuk .NET tidak langsung berisi bahasa mesin melainkan IL (Intermediate Language) dan metadata. Bila dibandingkan dengan Java, file JAR juga tidak langsung berisi bahasa mesin melainkan bytecode.

Untuk melihat informasi sebuah assembly, saya dapat menggunakan tool ILDASM.EXE bawaan Visual Studio:

Mencari tool IL Disassembler

Mencari tool IL Disassembler

Gambar berikut ini memperlihatkan contoh tampilan ILDASM.EXE:

Memakai IL Disassembler

Memakai IL Disassembler

Pada gambar di atas terlihat bahwa hasil reverse engineering dari method main() bukanlah dalam bentuk bahasa mesin x86 melainkan dalam bahasa perantara Intermediate Language (IL). Selain itu, gambar di atas juga memperlihatkan bahwa sebuah assembly (dalam bentuk file EXE/DLL) memiliki informasi metadata yang disebut sebagai assembly manifest. Pada file JAR untuk Java, informasi metadata seperti ini diletakkan di folder META-INF di dalam file JAR tersebut.

Untuk mengatur nilai pada assembly manifest, saya dapat mengubah file AssemblyInfo.cs yang dihasilkan oleh Visual Studio secara otomatis pada saat saya membuat proyek baru, seperti yang terlihat pada gambar berikut ini:

AssemblyInfo.cs yang dihasilkan Visual Studio

AssemblyInfo.cs yang dihasilkan Visual Studio

Untuk mendapatkan informasi tentang metadata di assembly melalui kode program, saya dapat memakai class Assembly seperti pada contoh kode program berikut ini:

using System;
using System.Reflection;

namespace Latihan
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly assembly = Assembly.GetExecutingAssembly();
            AssemblyName assemblyName = assembly.GetName();
            Console.WriteLine("Nama lengkap assembly ini adalah {0}", assembly.FullName);
            Console.WriteLine("Nama: {0}", assemblyName.Name);
            Console.WriteLine("Versi: {0}", assemblyName.Version);
            Console.WriteLine("Codebase: {0}", assemblyName.CodeBase);
            Console.ReadLine();
        }
    }
}

Kode program di atas akan menghasilkan output seperti:

Nama lengkap assembly ini adalah Latihan, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
Nama: Latihan
Versi: 1.0.0.0
Codebase: file:///C:/Latihan/bin/Debug/Latihan.EXE

Saya juga dapat membuat sebuah application manifest di lokasi yang sama dengan AssemblyInfo.cs. Salah satu kegunaannya adalah memunculkan dialog UAC setiap kali program dijalankan (sehingga program dijalankan sebagai administrator). Caranya adalah dengan men-klik kanan nama proyek dan memilih menu Add, New Item. Pada dialog yang muncul, saya memilih Application Manifest File dan men-klik tombol Add. Saya kemudian mengubah isi file app.manifest menjadi seperti berikut ini:

<?xml version="1.0" encoding="utf-8"?>
<asmv1:assembly manifestVersion="1.0" xmlns="urn:schemas-microsoft-com:asm.v1" xmlns:asmv1="urn:schemas-microsoft-com:asm.v1" xmlns:asmv2="urn:schemas-microsoft-com:asm.v2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>
  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">
    <security>
      <requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">
        <requestedExecutionLevel level="requireAdministrator" />
      </requestedPrivileges>
    </security>
  </trustInfo>
</asmv1:assembly>

Sekarang, bila saya menjalankan program dengan men-double click assembly (file EXE), saya akan memperoleh tampilan seperti pada gambar berikut ini:

Dialog UAC muncul setiap kali program dijalankan

Dialog UAC muncul setiap kali program dijalankan

Untuk melihat daftar assembly yang sedang aktif di memori, saya dapat membuat kode program seperti berikut ini:

using System;
using System.Reflection;

namespace Latihan
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Daftar Assembly Yang Sedang Dipakai:\n");
            foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies())
            {
                AssemblyName asmName = asm.GetName();
                Console.WriteLine("{0} {1}", asmName.Name, asmName.Version);
            }
            Console.ReadLine();
        }
    }
}

Contoh tampilan program di atas akan terlihat seperti berikut ini:

Daftar Assembly Yang Sedang Dipakai:

mscorlib 4.0.0.0
Microsoft.VisualStudio.HostingProcess.Utilities 10.0.0.0
System.Windows.Forms 4.0.0.0
System.Drawing 4.0.0.0
System 4.0.0.0
Microsoft.VisualStudio.HostingProcess.Utilities.Sync 10.0.0.0
Microsoft.VisualStudio.Debugger.Runtime 10.0.0.0
vshost32 10.0.0.0
System.Core 4.0.0.0
System.Xml.Linq 4.0.0.0
System.Data.DataSetExtensions 4.0.0.0
Microsoft.CSharp 4.0.0.0
System.Data 4.0.0.0
System.Xml 4.0.0.0
Latihan 1.0.0.0

Untuk membaca ‘bytecode’ yang berisi IL untuk sebuah method, saya dapat menggunakan kode program seperti berikut ini:

using System;
using System.Reflection;

namespace Latihan
{
    class Program
    {
        static void Main(string[] args)
        {
            MethodInfo mi = typeof(Console).GetMethod("ReadLine");
            byte[] il = mi.GetMethodBody().GetILAsByteArray();
            foreach (byte b in il) 
            {
                Console.Write("{0} ", b.ToString);
            }
            Console.ReadLine();
        }
    }
}

Perihal Solid Snake
I'm nothing...

Apa komentar Anda?

Please log in using one of these methods to post your comment:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: