Click Here to Install Silverlight*
IndonesiaChange|All Microsoft Sites
Microsoft
|Events|Promotions|Support

Made in Express Contest

Join us for a complimentary e-learning course. Get a Free Discovery Pack

License Advisor for Volume Licensing


Indonesia Home > MSDN

"Paste As Visual Basic"

Add-in Visual Studio yang melakukan konversi kode C# menjadi kode Visual Basic.

Risman Adnan

Nopember 2006

Artikel ini akan mendiskusikan tentang :
  • Artikel ini akan mendiskusikan
  • Menggunakan web services konversi kode C# ke VB
  • Unit testing terhadap kode.
  • Membuat Visual Studio Add-In
  • Menambahkan menu pada Visual Studio.

Konsep "Paste As". mengingatkan kita pada salah satu fitur pada Microsoft Word. Microsoft Word memungkinkan kita melakukan penyalinan informasi sesuai dengan kebutuhan. Sebagai contoh pada saat kita menyalin suatu informasi dari browser kemudian memindahkannya ke berkas dokumen maka kita dapat menggunakan fitur "paste as.." untuk menyalin informasi dari browser tanpa menyalin format HTM. Fitur ini bila diterapkan pada Visual Studio tentunya akan cukup bermanfaat, namun daripada sekedar mengeliminasi format HTML, paste as pada artikel ini akan melakukan pengkonversian dari kode Visual Basic ke C#.

Membuat Aplikasi Add-In di Visual Studio

Saat ini telah banyak ditemukan sekumpulan layanan pengkonversian kode secara online. Layanan yang ada pada umumnya berupa aplikasi web. Bila kita kembali membicarakan tentang solusi web maka sudah dapat dipastikan tidak ada jaminan bahwa layanan yang kita gunakan ada untuk seterusnya, atau setidaknya terdapat kemungkinan perbedaan implementasi yang mengakibatkan perubahan perilaku kode. Selain banyak ditemukan layanan melakukan pengkonversian kode, mekanisme pengkonversian juga memanfaatkan algoritma yang berbeda. Algoritma yang satu dengan yang lain belum tentu sama sehingga bukan tidak mungkin bila kita menggunakan lebih dari satu layanan pengkonversian kode, hasilnya tidak selalu sama. Berdasar pada keadaan saat ini maka sebenarnya pada masa yang akan datang tidaklah sulit bagi Visual Studio untuk menerapkan konversi kode sebagai salah satu fiturnya.

Sekarang mari kita mulai berpikir secara abstrak bagaimana inti dari konversi kode. Kita dapat membuat sebuah interface sebagai contoh dengan nama IConvertCode. Interface ini menggambarkan operasi standar pengkonversian kode tentunya. Seperti halnya sifat sebuah interface, kita akan mengabaikan implementasi operasinya

Public Interface IConvertCode
    Function Convert(ByVal csCode As String) As String
    ReadOnly Property ConverterName() As String
End Interface

Konversi mengambil masukan berupa sekumpulan kode C# kemudian menghasilkan kode keluaran berupa kode VB. ConverterName berperan mengambil nilai string dari nama konverter sebagai identifikasi unik penerjemah kode.

Implementasi ini pertama kali dari interface ini dilakukan oleh Kamal Patel's C# to VB converter web services yang dapat diakses di http://kamalpatel.net/ConvertCSharp2VB.aspx . Setelah referensi web dikaitkan pada visual studio maka berikutnya pemakaian kodenya tidaklah sulit. Seperti yang digambarkan pada kode berikut.

Public Class WSConvert
    Implements IConvertCode

    Public Function Convert(ByVal csCode As String) As String _
            Implements IConvertCode.Convert

        Dim codeConverter As _
            New CSToVBWebService.ConvertCSharp2VBService()
        Return codeConverter.Execute(csCode)

    End Function

    Public ReadOnly Property ConverterName() As String _
            Implements IConvertCode.ConverterName
        Get
            Return "Kamal Patel's Converter"
        End Get
    End Property
End Class

Konverter yang cukup baik lainnya adalah Carlos Aguilar AJAX-powered web services. Dapat diakses melalui http://carlosag.net/Tools/CodeTranslator/Default.aspx. Pola konversi dibantu dengan Ajax sehingga konversi dilakukan secara tidak sinkron sehingga lebih user friendly. Kode berikut menggambarkan konsep implementasi lain dari interface IConvertCode.

Public Class CAConvert
    Implements IConvertCode

    Public Function Convert(ByVal csCode As String) As String _
            Implements IConvertCode.Convert
    
        Dim formFields As New NameValueCollection
        formFields.Add("code", csCode)
        formFields.Add("Language", "C#")
        formFields.Add("DestinationLanguage", "VB")

        Dim client As New WebClient
        Return Encoding.ASCII.GetString( _
            client.UploadValues( _
                "http://www.carlosag.net/Tools/" & _
                "CodeTranslator/translate.ashx", _
                "POST", formFields _
            ) _
        )

    End Function

    Public ReadOnly Property ConverterName() As String _
            Implements IConvertCode.ConverterName
        Get
            Return "Carlos Aguilar's Converter"
        End Get
    End Property
End Class

Kode implementasi di atas melakukan konversi dengan memecah-mecah kode dalam bentuk form field. Kode Visual Basic yang dihasilkan dikirimkan dalam bentuk respons HTTP. Kumpulan kode C# disimpan dalam variabel koleksi (NameValueCollection). Kode tersebut kemudian diterjemahkan satu demi satu. Setiap hasil yang diperoleh disimpan dalam variabel koleksi (DestinationLanguageItem). Setelah semua kode berhasil diterjemahkan, maka variabel koleksi (DestinationLanguageItem) dikirimkan melalui bantuan metode WebClient.Upload(). Metode ini akan melakukan aksi http post dan mengembalikan hasil berupa byte array. Array tersebut kemudian di enkode dengan bantuan metode Encoding.ASCII.GetString(). String yang dihasilkan berisi hasil konversi berupa kode Visual Basic.

Berdasar pada kajian di atas kita menemukan dua implementasi yang berbeda namun menggunakan sebuah interface yang sama. Keduanya memiliki metode untuk mengambil kode C# dan mengembalikannya dalam kode Visual Basic.

Pengujian Implementasi dengan Unit Testing

Hal yang menarik dalam pengujian apabila kita memiliki Visual Studio Team Suite (atau Visual Studio Team edition for Software Developers) adalah kemampuan IDE untuk melakukan pengujian secara otomatis. Hal yang dilakukan untuk melakukan pengujian adalah hanya dengan mengakses konteks menu (klik kanan menu) pada method yang akan diujikan.

Pada saat pertamakali kita membuat pengujian, VSTS akan menambahkan proyek unit test pada solution aplikasi. Unit test untuk menguji method konversi adalah sebagai berikut.

 _
Public Sub CAConvertTest()
    Dim target As IConvertCode = New CAConvert()

    Dim csCode As String = My.Computer.FileSystem.ReadAllText( _
        DataDir & "\CSCode.txt")

    Dim expected As String = My.Computer.FileSystem.ReadAllText( _
        DataDir & "\CAVBCode.txt")
    Dim actual As String

    actual = target.Convert(csCode)
    Assert.AreEqual(expected, actual, _
        "PasteAsVB.CAConvert.Convert did not return the expected _ value.")
End Sub

Pengujian akan melakukan pembacaan berkas yang berisi kode C# yang akan diterjemahkan menjadi kode VB. Hasil terjemahan kemudian dibandingkan dengan kode VB yang telah tersimpan di berkas teks. Jika hasilnya seusai dengan berkas VB yang telah ditentukan sebelumnya maka unit test dapat dikatakan berhasil. Jendela Test Manager memudahkan kita untuk menjalankan test , melihat hasil test, dan juga membuat yakin bahwa kode yang dibuat sesuai dengan yang diharapkan.

Hasil unit test akan memberikan kita keyakinan bahwa implementasi logis aplikasi sesuai dengan apa yang kita harapkan. Berdasar pada hasil unit test kita dapat beranjak untuk mengembangkan add-in Visual Studio yang berperan melakukan hal yang sama dengan "paste as..".

Mengembangkan Project Add-in

Mengembangkan add-in pada Visual studio bukanlah hal yang sulit. Pada tipe project pilih Other Project Types ' Extensible Studio ' Visual Studio Add-in. Kita dapat membuat Project baru atau menambahkan Project yang kita buat dalam sebuah solusi.

Project akan menuntun kita untuk membuat kode skeleton melalui berbagai pertanyaan sebagai berikut.

  • Apa nama add-in?
  • Apakah add-in akan tampil di toolbar?
  • Apakah add-in akan diaktifkan pada saat Visual Studio aktif?
  • Dan Apakah add-in akan bersifat modeless sehingga dapat dipakai menggunakan command line.

Pengembangan add-in Visual Studio 2005 diawali dengan kode yang dibuat oleh VS setelah kita memilih opsi berdasar petunjuk yang disampaikan. Class add-in dikembangkan berdasar pada implementasi class IExtensibility2, yang meruapakan interface yang digunakan untuk komunikasi antara add-in dan Visual Studio. Method seperti OnConnection dan QueryStatus adalah contoh method yang digunakan untuk berkomunikasi.

Pada saat kita mengeset add-in sebagai start up project dan men-debugnya dengan F5 maka hal yang menarik terjadi. Add-in akan di-debug dengan memanggil instance lain dari Visual Studio yang terpasang add-in tersebut. Sama halnya dengan tipe project lainnya, kita dapat melakukan breakpoint, dan juga men-debug seperti biasanya.

Beberapa hal yang akan dilakukan pada project add-in yang akan dibuat adalah mengeset lokasi add-in pada menu yang secara default diletakkan di bawah menu tools diubah sehingga akan tampil setelah paste menuitem. Kode berikut menggambarkan apa yang harus dilakukan dengan memodifikasi OnConnection method.

Public Sub OnConnection(ByVal application As Object, _
        ByVal connectMode As ext_ConnectMode, _
        ByVal addInInst As Object, _
        ByRef custom As Array) Implements IDTExtensibility2.OnConnection

    _applicationObject = CType(application, DTE2)
    _addInInstance = CType(addInInst, AddIn)
    If connectMode = ext_ConnectMode.ext_cm_UISetup Then

        Dim commands As Commands2 = CType( _
            _applicationObject.Commands, Commands2)
        Dim editMenuName As String

        Try
            Dim resourceManager As System.Resources.ResourceManager = _
                New System.Resources.ResourceManager( _
                    "PasteAsVBAddIn.CommandBar", _
                    System.Reflection.Assembly.GetExecutingAssembly())

            Dim cultureInfo As System.Globalization.CultureInfo = _
                New System.Globalization.CultureInfo( _
                    _applicationObject.LocaleID)
            editMenuName = resourceManager.GetString( _
                String.Concat(cultureInfo.TwoLetterISOLanguageName, _ 
                    "Edit"))

        Catch e As Exception
            editMenuName = "Edit"
        End Try

        Dim commandBars As CommandBars = _
            CType(_applicationObject.CommandBars, CommandBars)
     Dim menuBarCommandBar As CommandBar = commandBars.Item("MenuBar")
        Dim editControl As CommandBarControl = _
            menuBarCommandBar.Controls.Item(editMenuName)
 Dim editPopup As CommandBarPopup = CType(editControl, CommandBarPopup)
        Try
            Dim command As Command = commands.AddNamedCommand2( _
                _addInInstance, "PasteAsVBAddIn", _
                "Paste as Visual Basic", _
                "Convert the clipboard content from C# " & _
                    "to Visual Basic and paste", _
                True, 59, Nothing, _
                CType(vsCommandStatus.vsCommandStatusSupported,Integer)+ _
              CType(vsCommandStatus.vsCommandStatusEnabled, Integer), _
                vsCommandStyle.vsCommandStylePictAndText, _
                vsCommandControlType.vsCommandControlTypeButton)

            command.AddControl(editPopup.CommandBar, 12)
        Catch argumentException As System.ArgumentException
        End Try

    End If
End Sub

Beberapa hal yang patut dipahami berdasar perubahan di atas dijelaskan pada paragraf-paragraf berikut. Project menggunakan resource CommandBar.resx yang berisi properti teks bagi add-in yang di dalamnya tersimpan sejumlah padanan kata untuk penggunaan add-in pada berbagai bahasa. Kode berikut ini menampilkan menu item yang dipakai berdasar konfigurasi bahasa.

editMenuName = resourceManager.GetString( _
    String.Concat(cultureInfo.TwoLetterISOLanguageName, "Edit"))

Jika add-in digunakan pada komputer dengan bahasa U.S english maka aplikasi akan membaca nilai edit menu yang menggunakan nama enEdit. Hal yang sama juga terjadi bila komputer digunakan dengan menggunakan bahasa Jerman, maka nama edit menu adalah deEdit. Kode tersebut beermanfaatuntuk mencari nama editMenu yang sesuai dengan kultur secara pemograman. Setelah menemukan nama edit menu maka kita dapat mendapatkan lokasi tempat menu tersebut berada beserta submenu yang dimiliki edit menu tersebut. Kode berikut bermanfaat dalam melakukan hal tersebut.

Dim editControl As CommandBarControl = _
    menuBarCommandBar.Controls.Item(editMenuName)
Dim editPopup As CommandBarPopup = CType(editControl, CommandBarPopup)

Lokasi yang telah ditemukan memudahkan kita untuk menambahkan menu yang kita kehendaki. Kode berikut berperan untuk menambahkan submenu pada edit menu .

Dim command As Command = commands.AddNamedCommand2( _
    _addInInstance, "PasteAsVBAddIn", "Paste as Visual Basic", _
    "Convert the clipboard content from C# to Visual Basic and paste", _
    True, 59, Nothing, _
    CType(vsCommandStatus.vsCommandStatusSupported, Integer) + _
    CType(vsCommandStatus.vsCommandStatusEnabled, Integer), _
    vsCommandStyle.vsCommandStylePictAndText, _
    vsCommandControlType.vsCommandControlTypeButton)

command.AddControl(editPopup.CommandBar, 12)

Menu yang kita buat terletak di posisi 12 yang berada tepat setelah menu item paste berada.

Hal penting yang patut diperhatikan adalah menu tersebut hanya aktif pada saat pengguna mengedit kode Visual Basic. Pengaktifan dan pengnonaktifkan menu dapat diakses melalui method QueryStatus. Kode berikut akan melakukannya

Public Sub QueryStatus( _
    ByVal commandName As String, _
    ByVal neededText As vsCommandStatusTextWanted, _
    ByRef status As vsCommandStatus, _
    ByRef commandText As Object) Implements IDTCommandTarget.QueryStatus

    If neededText = _
        vsCommandStatusTextWanted.vsCommandStatusTextWantedNone Then

        If commandName = "PasteAsVBAddIn.Connect.PasteAsVBAddIn" Then
            If _applicationObject.ActiveDocument IsNot Nothing _
            AndAlso _
                LCase(_applicationObject.ActiveDocument.FullName) _
                    .EndsWith(".vb") _
            AndAlso My.Computer.Clipboard.GetText <> String.Empty Then
              status = CType(vsCommandStatus.vsCommandStatusEnabled + _
                    vsCommandStatus.vsCommandStatusSupported, _
                    vsCommandStatus)
            Else
             status = CType(vsCommandStatus.vsCommandStatusSupported, _
                    vsCommandStatus)
            End If
        Else
            status = vsCommandStatus.vsCommandStatusUnsupported
        End If
    End If
End Sub

Kode di atas melakukan aktifasi menu pada saat aplikasi visual studio membuka berkas berekstensi. VB dan clipboard tidak dalam keadaan kosong.

Setelah mengintegrasikan menu add-in dengan Visual Studio maka yang dapat kita lakukan selanjutnya adalah melakukan konversi dan menyalinnya ke teks editor Visual Studio. Sebagai upaya rich experience bagi pengguna maka dikembangkan antarmuka yang memungkinkan pengguna memilih opsi konversi dan melakukan preview hasil konversi.

Area C# source menampilkan kode yang tersimpan di dalam clipboard. Listbox memungkinkan pengguna untuk memilih versi translasi yang telah kita diskusikan sebelumnya. Preview button akan melakukan penggenerasian kode VB hasil konversi. Button Convert akan melakukan konversi dan meletakkannya ke tempat kursor editor kita berada. Terdapat pula CheckBox yang akan melakukan pemformatan kode seperti yang sesuai. Kode berikut adalah kode yang dipakai pada form, kodenya tentunya tidaklah rumit dan menggunakan implementasi interface yang telah kita bahas sebelumnya.

Private converters() As IConvertCode = { _
    New PasteAsVB.CAConvert(), _
    New PasteAsVB.WSConvert() _
    }

Private Sub ConverterForm_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles MyBase.Load
    CsSourceTextBox.Text = My.Computer.Clipboard.GetText
    ConverterListBox.ValueMember = "ConverterName"
    ConverterListBox.DisplayMember = "ConverterName"
    ConverterListBox.DataSource = converters
End Sub

Ketika form dipanggil maka array converters akan di-instance. Converter mengimplementasikan interface IConvertCode. Listbox akan melakukan pengikatan data berdasar pada properti ConverterName dan menampilkannya. Bila hendak menambahkan konverter maka yang dapat dilakukan adalah membuat class yang mengimplementasikan IConvertCode dan menambahkan dalam array converters. Atau cara lain adalah menyimpannya ke dalam berkas konfigurasi.

Ketika tombol preview dipilih maka converter terpilih akan melakukan konversi dan menampilkan hasil konversi di preview TextBox. Ketika tombol convert dipilih maka hasil konversi akan diset ke properti keluaran form dan form akan ditutup. Kode berikut menggambarkan fungsionalitasnya.

Private Sub Preview_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Preview.Click

    Dim oldCursor As Cursor = Cursor
    Cursor = Windows.Forms.Cursors.WaitCursor

    Dim convertedCode As String = GetConvertedCode(CsSourceTextBox.Text)
    VbResultsTextBox.Text = convertedCode
    Cursor = oldCursor
End Sub

Private Sub ConvertButton_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles ConvertButton.Click

    Dim oldCursor As Cursor = Cursor
    Cursor = Windows.Forms.Cursors.WaitCursor

    VBCode = GetConvertedCode(CsSourceTextBox.Text)
    Cursor = oldCursor
    Me.DialogResult = Windows.Forms.DialogResult.OK
End Sub

Private Function GetConvertedCode(ByVal csCode As String) As String
    Dim converter As IConvertCode = ConverterListBox.SelectedItem
    Dim convertedCode As String = converter.Convert(csCode)
    Return convertedCode
End Function

Form Konversi tersebut akan dipanggil pada saat pengguna memilih menu "Paste as". Kode berikut menggambarkan bagaimana kita memanggil form add-in yang telah kita buat.

Public Sub Exec(ByVal commandName As String, _
    ByVal executeOption As vsCommandExecOption, _
    ByRef varIn As Object, ByRef varOut As Object, _
    ByRef handled As Boolean) Implements IDTCommandTarget.Exec

    handled = False
    If executeOption=vsCommandExecOption.vsCommandExecOptionDoDefault Then
        If commandName = "PasteAsVBAddIn.Connect.PasteAsVBAddIn" Then
            Dim f As New ConverterForm()
          If f.ShowDialog() = System.Windows.Forms.DialogResult.OK Then
                _applicationObject.ActiveDocument _
                    .Selection.Insert(f.VBCode)
                If f.Reformat Then
                   _applicationObject.ExecuteCommand( _
                        "Edit.FormatDocument")
                End If
            End If
            handled = True
            Exit Sub
        End If
    End If
End Sub

Sekarang mari kita simpulkan langkah kerja add-in yang telah kita buat.

  1. Pengguna memilih menu add-in
  2. Form konversi ditampilkan
  3. Jika konversi dilakukan (dengan memilih convert ) maka aplikasi akan menyimpan hasilnya ke properti milik form.
  4. Form akan mengembalikan nilai DialogResult.OK dan memasukkan hasilnya ke editor kode yang tengah aktif.
  5. Jika pengguna juga memilih opsi pemformatan maka add-in akan melakukan eksekusi Edit.FormatDocument untuk melakukan pemformatan ulang kode.

Kesimpulan

Visual Studio 2005 hadir untuk menyederhanakan berbagai tugas developer termasuk dalam pengembangan add-in. Visual Studio akan melakukan generate kode secara otomatis kemudian setelah kita memodifikasi kode yang kita butuhkan, visual studio juga dapat melakukan debugging dengan memanggil instance lain.

Pada kesempatan ini kita membuat add-in yang cukup bermanfaat yakni "Paste As" suatu utilitas yang berperan mengonversikan kode C# ke Visual Basic. Add-in yang dikembangkan berdasar pada utilitas konversi yang tersedia di internet yang dapat diakses melalui web services. Dan tentunya tidaklah sulit untuk menambahkannya sesuai dengan kebutuhan.

Pengembangan add-in dengan Visual Studio 2005 tentunya akan menjadi lebih mudah dan kini saat yang tepat bagi kita untuk berimajinasi add-in yang bermanfaat.

Top of pageTop of page

 


©2017 Microsoft Corporation. All rights reserved. Contact Us |Terms of Use |Trademarks |Privacy Statement
Microsoft