Mash Up: Code Converter
This is a code converter that uses two different DLL files from around the .NET community. New Ver. 2013 is available for download.
- Download source and demo - 594 KB
- New CodeConverter 2013 - 891 KB
- Download conversion wrapper - 214 KB
- Download source and demo (external link)
- Download rsp.ConVert.dll source (external link)
Before
After
Convert Projects Image
Fix Converted Project Files
Code Converter 2013
Introduction
This is a Code Converter that uses four different DLL files from around the .NET community. The DLL files I used are FastColoredTextBox.dll, ConversionWrapper.dll, ICSharpCode.NRefactory.dll, and rsp.ConVert.dll. I came up with this Idea mainly from the FastColoredTextBox
. Then I discovered the VS Addin (CodeConvert
), both can be found here on CodeProject
. I use the same DLL that the VS add-in uses. The ICSharpCode.NRefactory DLL can be found at their website. FastColoredTextBox
is used for the syntax coloring. CodeConvert
is referenced and does just as it says. The ICSharpCode.NRefactory DLL accompanies the CodeConvert.dll file.
rspConVert.dll is a remake of Deniz Ezen's Econ.NetVert.Dll. I stripped out the asp.net part as I could not get it to work. I also re-edited some of his code to work with my program. I added Project Conversions and Post fix for the files of the project conversion.
Background
There are a lot of code converters out there, but, 99 percent of them are web-based and 1 or 2 are Visual Studio Addins. The addins, I must say, definitely have an advantage over the web-based converters and they probably have a slight advantage over this one also, but, you do not have to open Visual Studio and you do not have to keep switching back and forth between your app and the Internet. You can open any *.cs, or *.vb file and convert it, and then use it in Visual Studio at a later time if needed by saving it as a text file or a *.cs, *.vb file using NotePad++.
The Code
I cannot think of very much to write when the whole program consists of 79 lines of code without the whitespace, but I'll give it a try. CodeConvert.dll only converts *.cs and *.vb files. It doesn't do snippets, such as, subs or functions by themselves. Whole files only.
Now let's take a look at the code below.
buttonClearAllCode_Click
Here we set each
TextBox
toString.Empty
.buttonCopyCSharpCode_Click
Here we add the
txtCSharp.Text
to theClipboard
.buttonCopyVBCode_Click
Here we add the
txtVBnet.Text
to theClipboard
.buttonConvertCSharpToVB_Click
This is where all the work is done for converting C# to VB. In the
CodeConversionHelper
class in the ICSharpCode.NRefactory DLL, there are three functions that take care of the conversions. These are:Public Shared Function ConvertCSharpToVB(ByVal sourceCode As String) As String
Public Shared Function ConvertVBToCSharp(ByVal sourceCode As String) As String
Private Shared Function GenerateCode(ByVal sourceCode As String, ByVal language As SupportedLanguage) As String
In the
buttonConvertCSharpToVB_Click
event, we call the functionConvertCSharpToVB(txtCSharp.Text)
. This, then calls the functionGenerateCode(ByVal sourceCode As String, ByVal language As SupportedLanguage)
. The source code would betxtCSharp.Text
and the supported language would beCSharp
. TheGenerateCode
function, then calls on 6 more classes that are in theICSharpCode.NRefactory dll
which is indeed beyond the scope of this article. TheGenerateCode
source follows...Private Shared Function GenerateCode(ByVal sourceCode As String, ByVal language As SupportedLanguage) As String Using parser As IParser = ParserFactory.CreateParser(language, New StringReader(sourceCode)) parser.Parse If (parser.Errors.Count = 0) Then Dim visitor As IOutputAstVisitor Dim specials As IList(Of ISpecial) = New ISpecial(0 - 1) {} If (language = SupportedLanguage.CSharp) Then visitor = New VBNetOutputVisitor Else visitor = New CSharpOutputVisitor End If Using SpecialNodesInserter.Install(specials, visitor) parser.CompilationUnit.AcceptVisitor(visitor, Nothing) End Using Return visitor.Text End If Dim builder As New StringBuilder Return parser.Errors.ErrorOutput End Using End Function
buttonConvertVBtoCSharp_Click
This is where all the work is done for converting VB to C#. It calls the same three functions as the
buttonConvertCSharpToVB_Click
event. Please see above.OpenToolStripMenuItem_Click
When the
OpenFileDialog
appears, and we select a file to open, the program knows where to input the selected file. If it is a*.cs
file it will be opened in thetxtCSharp TextBox
and the same for a*.vb
file in thetxtVBnet TextBox
. First, the file gets read and then inserted.frmConverter_FormClosing
Here we just
Dispose
of theTextBoxes
.frmConverter_Load
If the window is maximized or normal we set the
SplitterDistance
in in the center of the form.frmConverter_SizeChanged
We do the same thing in this sub for the
SplitterDistance
, except we setpanel1Collapsed
toTrue
when minimised. This stops an exception from being thrown. This meaning that theSplitterDistance
cannot be (-1).
The whole program is pasted below:
Imports CodeConvert.ConversionLoader
Imports CodeConvert
Imports ICSharpCode.NRefactory
Imports System
Imports System.IO
Imports System.Text
Imports System.Environment
Imports FastColoredTextBoxNS
Public Class frmConverter
Private Sub buttonClearAllCode_Click(sender As Object, _
e As System.EventArgs) Handles buttonClearAllCode.Click
txtCSharp.Text = String.Empty
txtVBnet.Text = String.Empty
End Sub
Private Sub buttonCopyCSharpCode_Click(sender As Object, _
e As System.EventArgs) Handles buttonCopyCSharpCode.Click
My.Computer.Clipboard.SetText(txtCSharp.Text)
End Sub
Private Sub buttonCopyVBCode_Click(sender As Object, _
e As System.EventArgs) Handles buttonCopyVBCode.Click
My.Computer.Clipboard.SetText(txtVBnet.Text)
End Sub
Private Sub buttonConvertCSharpToVB_Click(sender As Object, _
e As System.EventArgs) Handles buttonConvertCSharpToVB.Click
Me.txtVBnet.Text = ConvertCSharpToVB(txtCSharp.Text)
txtVBnet.Text &= vbCrLf & vbCrLf & "'Converted By: CodeConverter 2011 Conversion Utility!"
End Sub
Private Sub buttonConvertVBtoCSharp_Click(sender As Object, _
e As System.EventArgs) Handles buttonConvertVBtoCSharp.Click
Me.txtCSharp.Text = ConvertVBToCSharp(txtVBnet.Text)
txtCSharp.Text &= vbCrLf & vbCrLf & "//Converted By: CodeConverter 2011 Conversion Utility!"
End Sub
Private Sub OpenToolStripMenuItem_Click(sender As Object, _
e As System.EventArgs) Handles OpenToolStripMenuItem.Click
Dim fName As String
ofd.Filter = "C-Sharp Files (*.cs)|*.cs|VB Files (*.vb)|*.vb"
If ofd.ShowDialog = Windows.Forms.DialogResult.OK Then
fName = ofd.FileName
If fName.EndsWith(".cs") Then
txtCSharp.Language = Language.CSharp
txtCSharp.Text = File.ReadAllText(fName)
buttonConvertCSharpToVB.Enabled = True
buttonConvertVBtoCSharp.Enabled = False
buttonCopyVBCode.Enabled = True
buttonCopyCSharpCode.Enabled = False
Else
txtVBnet.Text = File.ReadAllText(fName)
txtVBnet.Language = Language.VB
buttonConvertCSharpToVB.Enabled = False
buttonConvertVBtoCSharp.Enabled = True
buttonCopyVBCode.Enabled = False
buttonCopyCSharpCode.Enabled = True
End If
End If
End Sub
Private Sub frmConverter_FormClosing(sender As Object, _
e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
txtCSharp.Dispose()
txtVBnet.Dispose()
End Sub
Private Sub frmConverter_Load(sender As Object, _
e As System.EventArgs) Handles Me.Load
If Me.WindowState = FormWindowState.Maximized Then
sc1.SplitterDistance = ((sc1.Width / 2) - (sc1.SplitterWidth / 2))
Else
sc1.SplitterDistance = ((sc1.Width / 2) - (sc1.SplitterWidth / 2))
End If
End Sub
Private Sub frmConverter_SizeChanged(sender As Object, _
e As System.EventArgs) Handles Me.SizeChanged
If Me.WindowState = FormWindowState.Maximized Then
txtCSharp.BackgroundImageLayout = ImageLayout.Stretch
txtVBnet.BackgroundImageLayout = ImageLayout.Stretch
sc1.Panel1Collapsed = False
sc1.SplitterDistance = ((sc1.Width / 2) - (sc1.SplitterWidth / 2))
ElseIf Me.WindowState = FormWindowState.Minimized Then
sc1.Panel1Collapsed = True
Else
txtCSharp.BackgroundImageLayout = ImageLayout.Center
txtVBnet.BackgroundImageLayout = ImageLayout.Center
sc1.Panel1Collapsed = False
sc1.SplitterDistance = ((sc1.Width / 2) - (sc1.SplitterWidth / 2))
End If
End Sub
Private Sub CloseToolStripMenuItem_Click(sender As System.Object, _
e As System.EventArgs) Handles CloseToolStripMenuItem.Click
Application.Exit()
End Sub
End Class
Not All Errors are Created Equal
Not all errors can be fixed right now. As with all man-made things nothing is 100% reliable. So for now we have todo this manually to the example that follows...for now.
Implements Interface
C# does not require adding the implement statement after the required subs or functions. For now this will have to be done manually in
VBnet
. C# also does not require the (Handles
) statement, but it does display an Error message stating this fact when converting VB to C# and does the same for theImplements
clauses.AddHandler, AddressOf....Updated
In C#, an
Addhandler Statement
looks something like this... (Sub.Event += New(SomeTypeOfEventArgs)Sub_Event
) When Converting from C#, this is probably seen as an addition. After fiddling around with Expresso, I finally came up with a regex string that finds the C# codeSub.Event += New(SomeTypeOfEventArgs)Sub_Event
. Here is how we fix theAddHandler, AddressOf
statement in VB from C# that has been eluding all code converters until now.Private Sub VBFixIt() 'Not all errors can be fixed right now. As with all man-made things 'nothing is 100% reliable. 'I am trying to add all the toolbox components EventArgs to this area. 'This will be updated on a regular basis. Dim m As Match Dim strMatch As String Dim txtVBNetText As String = txtVBnet.Text lblStatus4.Text = "Please Wait...Conversion Started!!!" 'Some of the thirty+ fixes that need to be attended too. Dim regexStr As String = "\b\w+.+=\sNew\s\w+\(\w+_\w+\)" 'AddHandler Dim remregexStr As String = "\b\w+.-=\sNew\s\w+\(\w+_\w+\)" 'RemoveHandler Dim patternIsInteger As String = "\bAs\sObject\s\=\s(\d+.|\w+.SelectedIndex)" 'Integer Dim patternClass As String = "\bAs\sObject\s\=\sNew\s\w+\(\)" 'Class Dim patternTryCast As String = "\bAs\sObject\s\=\sTryCast\(e.Argument\,\s\w+\)" 'TryCast 'The more common System.Events fixes Dim patternSystemEventArgs As String = "\b\w+_(AcceptsTabChanged|AutoSizeChanged|" & _ "BackColorChanged|BackgroundImageChanged|BackgroundImageLayoutChanged" _ & "|BindingContextChanged|BorderStyleChanged|" & _ "CausesValidationChanged|Click|ClientSizeChanged|ContextMenuChanged" _ & "|ContextMenuStripChanged|CursorChanged|" & _ "DataSourceChanged|DisplayMemberChanged|Disposed|DockChanged|DoubleClick|DragLeave" _ & "|DropDown|DropDownClosed|DropDownStyleChanged|" & _ "EnabledChanged|FormatInfoChanged|FormatStringChanged|FormattingEnabledChanged" _ & "|Enter|FontChanged|ForeColorChanged|GotFocus|" & _ "HandleCreated|HandleDestroyed|HideSelectionChanged|ImeModeChanged|Leave|LocationChanged" _ & "|LostFocus|MarginChanged|MouseCaptureChanged|" & _ "Move|ModifiedChanged|MultilineChanged|PaddingChanged|ParentChanged|RegionChanged" _ & "|ReadOnlyChanged|Resize|RightToLeftChanged|" & _ "SizeChanged|StyleChanged|SystemColorsChanged|TabIndexChanged" _ & "|TabStopChanged|TextChanged|TextAlignChanged|" & _ "Validated|VisibleChanged|ValueMemberChanged|Load|FormClosed|MouseEnter" _ & "|MouseHover|MouseLeave|SelectionChangeCommitted|" & _ "SelectedIndexChanged|SelectedItemChanged|SelectedValueChanged)" & _ "\((ByVal\ssender\sAs\sObject\,\sByVal\se\sAs\s(EventArgs|" & _ "System\.EventArgs)\)|sender\sAs\sObject\,\se\sAs\s(EventArgs|System\.EventArgs)\))" Dim patternComponentModelCancelEventArgs As String = "\b\w+_Validating\((ByVal\ssender\sAs\sObject\," & _ "\sByVal\se\sAs\sSystem\.ComponentModel\.CancelEventArgs\)|" & _ "sender\sAs\sObject\,\se\sAs\sSystem\.ComponentModel\.CancelEventArgs)\)" Dim patternMeasureItemEventArgs As String = "\b\w+_MeasureItem\((ByVal\" & _ "ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\" & _ ".MeasureItemEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\" & _ ".Windows\.Forms\.MeasureItemEventArgs)\)" Dim patternListControlConvertEventArgs As String = "\b\w+_Format\((ByVal\" & _ "ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\." & _ "ListControlConvertEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\" & _ ".Windows\.Forms\.ListControlConvertEventArgs)\)" Dim patternDrawItemEventArgs As String = "\b\w+_DrawItem\((ByVal\ssender" & _ "\sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.DrawItemEventArgs\)" & _ "|sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.DrawItemEventArgs)\)" Dim patternQueryPageSettingsEventArgs As String = "\b\w+_QueryPageSettings\" & _ "((ByVal\ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\.Drawing\.Printing\" & _ ".QueryPageSettingsEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\" & _ ".Drawing\.Printing\.QueryPageSettingsEventArgs)\)" Dim patternPrintPageEventArgs As String = "\b\w+_PrintPage\((ByVal\" & _ "ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\.Drawing\.Printing\" & _ ".PrintPageEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\.Drawing\.Printing\.PrintPageEventArgs)\)" Dim patternPrintEventArgs As String = "\b\w+_(BeginPrint|EndPrint)\" & _ "((ByVal\ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\.Drawing\.Printing\" & _ ".PrintEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\.Drawing\.Printing\.PrintEventArgs)\)" Dim patternQueryAccessibilityHelpEventArgs As String = "\b\w+_QueryAccessibilityHelp\" & _ "((ByVal\ssender\sAs\sObject\,\sByVal\se\sAs\sSystem.Windows.Forms." & _ "QueryAccessibilityHelpEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\" & _ ".Windows\.Forms\.QueryAccessibilityHelpEventArgs)\)" Dim patternQueryContinueDragEventArgs As String = "\b\w+_QueryContinueDrag\" & _ "((ByVal\ssender\sAs\sObject\,\sByVal\se\sAs\sSystem.Windows.Forms." & _ "QueryContinueDragEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\" & _ ".Windows\.Forms\.QueryContinueDragEventArgs)\)" Dim patternCancelEventArgs As String = "\b\w+_Validating\((ByVal\ssender\" & _ "sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.CancelEventArgs\)|" & _ "sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.CancelEventArgs)\)" Dim patternFormClosingEventArgs As String = "\b\w+_FormClosing\((ByVal\ssender\" & _ "sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.FormClosingEventArgs\)" & _ "|sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.FormClosingEventArgs)\)" Dim patternPreviewKeyDownEventArgs As String = "\b\w+_PreviewKeyDown\((ByVal\" & _ "ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\." & _ "PreviewKeyDownEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\" & _ ".Windows\.Forms\.PreviewKeyDownEventArgs)\)" Dim patternPaintEventArgs As String = "\b\w+_Paint\((ByVal\ssender\" & _ "sAs\sObject\,|sender\sAs\sObject\,)\s(ByVal\se\sAs\sSystem\.Windows\" & _ ".Forms\.PaintEventArgs\)|e\sAs\sSystem\.Windows\.Forms\.PaintEventArgs)\)" Dim patternLayoutEventArgs As String = "\b\w+_HelpRequested\((ByVal\ssender\" & _ "sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.LayoutEventArgs\)|" & _ "sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.LayoutEventArgs)\)" Dim patternControlAddedRemoved As String = "\b\w+_(ControlAdded|ControlRemoved)" & _ "\((ByVal\ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\" & _ ".ControlEventArgs\)|sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.ControlEventArgs)\)" Dim patternChangeUICues As String = "\b\w+_ChangeUICues\((ByVal\ssender\sAs\" & _ "sObject\,\sByVal\se\sAs\sSystem\.Window\s.Forms\.UICuesEventArgs\)|" & _ "sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.UICuesEventArgs)\)" Dim patternGiveFeedback As String = "\b\w+_GiveFeedback\((ByVal\ssender\sAs\" & _ "sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.GiveFeedbackEventArgs\)" & _ "|sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.GiveFeedbackEventArgs)\)" Dim patternHelpRequested As String = "\b\w+_HelpRequested\((ByVal\ssender\sAs\" & _ "sObject\,\sByVal\shlpevent\sAs\sSystem\.Windows\.Forms\.HelpEventArgs\)|" & _ "sender\sAs\sObject\,\shlpevent\sAs\sSystem\.Windows\.Forms\.HelpEventArgs)\)" Dim patternInvalidated As String = "\b\w+_Invalidated\((ByVal\ssender\sAs\" & _ "sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.InvalidateEventArgs\)" & _ "|sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.InvalidateEventArgs)\)" Dim patternCheckChanged As String = "\b\w+_CheckChanged\((ByVal\ssender\sAs\" & _ "sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.CheckChangedEventArgs\)" & _ "|sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.CheckChangedEventArgs)\)" Dim patternBackgroundWorker As String = "\b\w+_(DoWork|ProgressChanged|" & _ "RunWorkerCompleted)\((ByVal\ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\" & _ ".ComponentModel\.(DoWorkEventArgs|ProgressChangedEventArgs|" & _ "RunWorkerCompletedEventArgs)\)|sender\sAs\sObject\,\se\sAs\sSystem\" & _ ".ComponentModel\.(DoWorkEventArgs|ProgressChangedEventArgs|RunWorkerCompletedEventArgs))\)" Dim patternMouseEventArgs As String = "\b\w+_(MouseUp|MouseDown|MouseMove)\" & _ "((ByVal\ssender\sAs\sObject\,\sByVal\se\sAs\sMouseEventArgs\)|" & _ "sender\sAs\sObject\,\se\sAs\sMouseEventArgs)\)" Dim patternKeysUpDown As String = "\b\w+_(KeyUp|KeyDown)\(ByVal\ssender\sAs\" & _ "sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.KeyEventArgs\)|" & _ "sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.KeyEventArgs\)" Dim patternKeyPress As String = "\b\w+_KeyPress\((ByVal\ssender\sAs\sObject\," & _ "\sByVal\se\sAs\s(System\.Windows\.Forms\.KeyPressEventArgs|KeyPressEventArgs)" & _ "\)|sender\sAs\sObject\,\se\sAs\s(System\.Windows\.Forms\" & _ ".KeyPressEventArgs|KeyPressEventArgs))\)" Dim patternDragDropEnter As String = "\b\w+_(DragDrop|DragEnter)\((ByVal\" & _ "ssender\sAs\sObject\,\sByVal\se\sAs\sSystem\.Windows\.Forms\.DragEventArgs\)" & _ "|sender\sAs\sObject\,\se\sAs\sSystem\.Windows\.Forms\.DragEventArgs)\)" '''Code Continues End Sub
After using ICsharp.NRefactory.dll for the conversion, I do a POST conversion fix using regex strings to fix the currently converted VB code. I also added a lot of post fixes on this upgrade. I still have along way to go to finish the post fixes, I keep coding away at it. I'll eventually finish.!!!
If you do not have the apps and DLLs below, Please get them as you will need them. They are all free.
Points of Interest
- SharpDevelop 3.2
- SharpDevelop 4.0
- CodeConvert
- FastColoredTextBox
- Notepad++ 5.9.3
- Expresso Regex Editor
- Econ.NetVert.Dll by Deniz Ezen
History
Added some extra subs that do post fix on the current code. Removed the picture that is probably crushing a nerve in some or all who downloaded the app before. Sorry for that flub.
The VBFixIt Sub
now has over 14,500 to 15,000 POST Conversion fixes using regex strings
- Uploaded 09-26-2011
- Uploaded 10-04-2011
- Uploaded 04-03-2012
- Uploaded 04-05-2012
- Uploaded 04-08-2012
- Uploaded 04-12-2012, Fixed some mental errors in the regex strings.
- Uploaded 04-18-2012, Changed the UI a little and added more regex strings.
This is suppose to be the last update. It probably wont be. I have completed adding all the toolbox components EVENTARGS, about 15,000 of them and still adding as I find different ways C# programmers are writing certain pieces of code (AddHandler
, RemoveHandler
, BeginEnvoke
, ...). If any C# programmers find different ways to write pieces of code, please e-mail me with you code attached so I can add it to the app. I hope you all will enjoy this application and hope it brings you's some very good use.
If there is anything in this article that sounds somewhat redundant, it probably is, so please do not leave a message stating this as I already know.