Check File Debug Mode Or Not !! and Integrate with Windows Explorer

Suatu ketika kita mungkin ditugaskan untuk mengecek aplikasi kita yang ada di server production dan kita ingin mengetahui apakah aplikasi atau library kita yang di deploy ke server production itu Debug Mode atau Release Mode. Ditambah lagi kita sudah ketahui bahwa di server production tidak mungkin diinstal Visual Studio sehingga hanya ada .NET Framework. So ini jadi problem karena masalah kecil yang ingin tahu apakah aplikasi atau library yang di deploy itu Debug Mode atau Release Mode !!

Pendekatan Solusi

Salah satu cara gampang yaitu membuat tool sederhana yang berguna untuk mengecek suatu aplikasi (*.exe) atau library (*.dll) itu running sebagai Debug Mode atau Release Mode. Gw disini ingin melakukan sharing bagaimana cara mengecek  Debug Mode atau Release Mode melalui coding.

Solusi yang gw coba usulkan adalah mengecek nilai attribute DebuggableAttribute dari assembly file tersebut. Setelah kita mendapat object DebuggableAttribute dari assembly file yang akan kita cek maka langkah selanjutnya adalah mengecek nilai propertie IsJITTrackingEnabled. Jika nilai IsJITTrackingEnabled adalah true berarti file tersebut Debug Mode atau sebaliknya. Disini gw buat wrapper class berbentuk helper object sebagai berikut:

   17     public sealed class CheckFileModeHelper

   18     {

   19         public static FileMode CheckMode(string fullFile)

   20         {

   21             FileMode mode = FileMode.NonDotnetFile;

   22             try

   23             {

   24                 Assembly asm = Assembly.LoadFile(fullFile);

   25                 mode = FileMode.Unknown;

   26                 foreach (object obj in asm.GetCustomAttributes(false))

   27                 {

   28                     if (obj is DebuggableAttribute)

   29                     {

   30                         if (((DebuggableAttribute)obj).IsJITTrackingEnabled)

   31                             mode = FileMode.Debug;

   32                         else

   33                             mode = FileMode.Release;

   34                         break;

   35                     }

   36                 }

   37             }

   38             catch (Exception){}

   39 

   40             return mode;

   41         }

   42     }

Nilai parameter fullFile adalah nama file + full path nya dari file yang akan kita cek. Method CheckMode ini juga mengembalikan enum object yang dideklarasikan sebagai berikut

    7     public enum FileMode

    8     {

    9         Debug,

   10         Release,

   11         NonDotnetFile,

   12         Unknown

   13     }

Kemudian wrapper object ini kita gunakan dalam GUI yang akan kita buat dengan bentuk seperti gambar dibawah ini

Tombol ... ini digunakan untuk Browse file yang akan dicek mode running disitu. Browse file disini memanfaatkan object OpenFileDialog sehingga ketika tombol ini diklik dan user memilih file yang akan di cek. Kemudian hasil pemilihan file melalui object OpenFileDialog akan ditampilkan kedalam TextBox kita. Berikut ini ilustrasi code nya:

   28         private void btnOpenFile_Click(object sender, EventArgs e)

   29         {

   30             if (openFileDialog1.ShowDialog() == DialogResult.OK)

   31                 this.txtFile.Text = openFileDialog1.FileName;

   32         }

Setelah file yang akan dicek telah dipilih maka selanjutnya kita melakukan pengecek dari mode file tersebut dengan memanfaatkan wrapper class yang telah dibuat diatas dan ini dipasang pada button Check File Mode. Berikut ini ilustrasi code nya:

   34         private void btnCheck_Click(object sender, EventArgs e)

   35         {

   36             string file = this.txtFile.Text;           

   37             if (file != "")

   38             {

   39                 if(!File.Exists(file))

   40                 {

   41                     MessageBox.Show("File is not found", "Information");

   42                     return;

   43                 }

   44 

   45                 string fileName = Path.GetFileName(file);

   46                 FileMode mode = CheckFileModeHelper.CheckMode(file);

   47                 if (mode == FileMode.NonDotnetFile || mode == FileMode.Unknown)

   48                     MessageBox.Show(fileName + " is " + mode.ToString(), "Information",

   49                                 MessageBoxButtons.OK,

   50                                 MessageBoxIcon.Information);

   51                 else

   52                     MessageBox.Show(fileName + " is " + mode.ToString() + " Mode", "Information",

   53                                 MessageBoxButtons.OK,

   54                                 MessageBoxIcon.Information);                                                  

   55 

   56             }

   57             else

   58                 MessageBox.Show("Choose file for checking", "Information");

   59         }

Baru sekarang kita coba testing. Pertama-tama klik tombol ... dan pilih file yang akan dicek. Setelah itu klik tombol Check File Mode. Kalau kita memilih file yang benar-benar dibuat dari .NET maka akan muncul seperti gambar dibawah ini:

Tapi kalau memang file (*.exe atau *.dll) itu bukan file .NET maka aplikasi akan memberikan response yang berbeda yang bentuknya seperti gambar dibawah ini

Integrasi Dengan Windows Explorer

Mungkin diantara kita atau mungkin gw sendiri rada malas, pingin gw langsung masuk ke Windows Explorer dan selanjutnya klik kanan pada file yang akan di cek Mode dan pilih menu untuk mengecek kemudian.... boommm... langsung keluar pop up dialog yang berisi status mode dari file tersebut. Caranya ? gampang banget...

Dengan memanfaatkan registry, kita bisa mengintegrasikan app kita kedalam Windows Explorer. Registry yang dapat kita gunakan yaitu

   27         private const string _menu = "*\\shell\\NewMenuOption";

   28         private const string _command = "*\\shell\\NewMenuOption\\command";

Selanjutnya kita buat GUI dari integrasi dari GUI utamanya seperti dibawah ini

Ketika kita tombol Integrate with Windows Explorer diklik maka kita melakukan register app kita ke registry sehingga akan muncuk context menu dibagian Windows Explorer, ilustrasi code sebagai berikut

   35         private void btnIntegrate_Click(object sender, EventArgs e)

   36         {

   37             RegistryKey regmenu = null;

   38             RegistryKey regAction = null;

   39             try

   40             {

   41                 string path = Assembly.GetExecutingAssembly().Location + " %1";

   42 

   43                 regmenu = Registry.ClassesRoot.CreateSubKey(_menu);

   44                 if (regmenu != null)

   45                     regmenu.SetValue("", "Check .NET File Mode");

   46                 regAction = Registry.ClassesRoot.CreateSubKey(_command);

   47                 if (regAction != null)

   48                     regAction.SetValue("", path);

   49 

   50                 MessageBox.Show("Bravo..Your app has integrated with Windows Explorer",

   51                     "Information");

   52             }

   53             catch (Exception ex)

   54             {

   55                 MessageBox.Show(this, ex.ToString());

   56             }

   57             finally

   58             {

   59                 if (regmenu != null)

   60                     regmenu.Close();

   61                 if (regAction != null)

   62                     regAction.Close();

   63             }              

   64         }

Tanda "%1" digunakan untuk passing selected file yang akan di cek Mode. Sedangkan nama context menu adalah Check .NET File Mode. Oleh karena adanya passing file maka code dibagian Entry Point kita harus dimodifikasi sehingga dapat menerima passing file dari Windows Explorer. Berikut ini modifikasi file nya:

   21         [STAThread]

   22         static void Main(string[] args)

   23         {

   24             if (args.Length > 0)

   25             {

   26                 string file = args[0];

   27                 string fileName = System.IO.Path.GetFileName(file);

   28                 FileMode mode = CheckFileModeHelper.CheckMode(file);

   29                 MessageBox.Show(fileName + " is " + mode.ToString() + " Mode", "Information",

   30                                 MessageBoxButtons.OK,

   31                                 MessageBoxIcon.Information);

   32             }

   33             else

   34             {

   35                 Application.EnableVisualStyles();

   36                 Application.SetCompatibleTextRenderingDefault(false);

   37                 Application.Run(new MainForm());

   38             }

   39         }

Sedangkan cara menghapus app kita dari Windows Explorer Integration yaitu dengan cara menghapus registry kita. Ilustrasi code sebagai berikut:

   66         private void btnRemove_Click(object sender, EventArgs e)

   67         {

   68             try

   69             {

   70                 RegistryKey reg = Registry.ClassesRoot.OpenSubKey(_command);

   71                 if (reg != null)

   72                 {

   73                     reg.Close();

   74                     Registry.ClassesRoot.DeleteSubKey(_command);

   75                 }

   76                 reg = Registry.ClassesRoot.OpenSubKey(_menu);

   77                 if (reg != null)

   78                 {

   79                     reg.Close();

   80                     Registry.ClassesRoot.DeleteSubKey(_menu);

   81                 }

   82 

   83                 MessageBox.Show("Your app has removed from Windows Explorer Integration",

   84                     "Information");

   85             }

   86             catch (Exception ex)

   87             {

   88                 MessageBox.Show(this, ex.ToString());

   89             }           

   90         }

Pada bagian GUI utama kita panggil form Windows Explorer Integration melalui tombol Integrate with Windows Explorer. Ilustrasi code:

   61         private void btnIntegrate_Click(object sender, EventArgs e)

   62         {

   63             IntegrateWindowsExplorer frm = new IntegrateWindowsExplorer();

   64             frm.ShowDialog();

   65         }

Ok, sekarang kita coba aplikasinya. Pertama-tama panggil GUI utamanya dan klik tombol Integrate with Windows Explorer. Kemudian klik tombol Integrate with Windows Explorer, jika sukses akan muncul pop up dialog konfirmasi.

Setelah itu panggil Windows Explorer, klik kanan file yang akan kita cek Mode seperti gambar dibawah ini:

Kemudian pilih menu Check .NET File Mode sehingga akan muncul kotak dialog sebagai hasil pengecekan file mode seperti gambar dibawah ini

Download Demo File

Untuk lebih lengkap file demo dari paper ini, dapat didownload di (pastikan terlebih dulu anda login atau register jika belum pernah daftar di PE College)  http://www.pecollege.net/Download/tabid/62/Default.aspx 

Jika ada feedback atau pertanyaan bisa langsung ditulis di bagian komentar...semoga berguna

 

Share this post: | | | |
Published Thursday, August 23, 2007 2:26 PM by Agus Kurniawan
Filed under: ,

Comments

# re: Check File Debug Mode Or Not !! and Integrate with Windows Explorer

Bagus, bisa kita coba.

Friday, March 07, 2008 8:16 PM by Kennedy