Mash Up:代码转换器
这是一个代码转换器,它使用了来自.NET社区的两个不同的DLL文件。新版本2013可供下载。
- 下载源代码和演示 - 594 KB
- 新版CodeConverter 2013 - 891 KB
- 下载转换包装器 - 214 KB
- 下载源代码和演示(外部链接)
- 下载rsp.ConVert.dll源代码(外部链接)
以前
操作后
转换项目图像
修复转换后的项目文件
Code Converter 2013
引言
这是一个代码转换器,它使用了来自.NET社区的四个不同的DLL文件。我使用的DLL文件是FastColoredTextBox.dll、ConversionWrapper.dll、ICSharpCode.NRefactory.dll和rsp.ConVert.dll。我主要从FastColoredTextBox
那里获得了这个想法。然后我发现了VS插件(CodeConvert
),它们都可以在CodeProject
上找到。我使用与VS插件相同的DLL。ICSharpCode.NRefactory DLL可以在其网站上找到。FastColoredTextBox
用于语法高亮。CodeConvert
被引用,并且正如其名称所示。ICSharpCode.NRefactory DLL与CodeConvert.dll文件一起提供。
rspConVert.dll是Deniz Ezen的Econ.NetVert.Dll的重制版。我删除了asp.net部分,因为我无法使其正常工作。我还重新编辑了他的一些代码以便与我的程序一起使用。我添加了项目转换和项目转换文件的后处理。
背景
市面上有很多代码转换器,但99%都是基于Web的,只有一两个是Visual Studio插件。我必须说,插件肯定比基于Web的转换器有优势,而且它们可能也比这个程序有轻微优势,但是,你不需要打开Visual Studio,也不需要不断地在你的应用程序和互联网之间切换。你可以打开任何*.cs或*.vb文件并进行转换,然后稍后在Visual Studio中使用它,方法是使用NotePad++将其保存为文本文件或*.cs, *.vb文件。
代码
我实在想不出太多要写的东西,因为整个程序不包括空格只有79行代码,但我会试试。CodeConvert.dll只转换*.cs和*.vb文件。它不做代码片段,例如单独的sub或function。只处理整个文件。
现在让我们看看下面的代码。
buttonClearAllCode_Click
在这里,我们将每个
TextBox
设置为String.Empty
。buttonCopyCSharpCode_Click
在这里,我们将
txtCSharp.Text
添加到Clipboard
。buttonCopyVBCode_Click
在这里,我们将
txtVBnet.Text
添加到Clipboard
。buttonConvertCSharpToVB_Click
这是将C#转换为VB的所有工作发生的地方。在ICSharpCode.NRefactory DLL的
CodeConversionHelper
类中,有三个函数负责转换。它们是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
在
buttonConvertCSharpToVB_Click
事件中,我们调用函数ConvertCSharpToVB(txtCSharp.Text)
。然后,它会调用函数GenerateCode(ByVal sourceCode As String, ByVal language As SupportedLanguage)
。源代码将是txtCSharp.Text
,而支持的语言将是CSharp
。GenerateCode
函数然后会调用ICSharpCode.NRefactory dll
中的另外6个类,这超出了本文的范围。GenerateCode
的源代码如下...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
这是将VB转换为C#的所有工作发生的地方。它调用与
buttonConvertCSharpToVB_Click
事件相同的三个函数。请参见上方。OpenToolStripMenuItem_Click
当
OpenFileDialog
出现时,如果我们选择一个文件打开,程序就知道在哪里输入选定的文件。如果它是*.cs
文件,它将在txtCSharp TextBox
中打开;如果是*.vb
文件,它将在txtVBnet TextBox
中打开。首先,文件将被读取然后插入。frmConverter_FormClosing
在这里,我们只是
Dispose
掉TextBoxes
。frmConverter_Load
如果窗口是最大化或正常大小,我们将
SplitterDistance
设置在窗体的中心。frmConverter_SizeChanged
在这个子程序中,我们对
SplitterDistance
做同样的事情,除了当窗口最小化时,我们将panel1Collapsed
设置为True
。这可以防止异常被抛出。这意味着SplitterDistance
不能为(-1)。
整个程序粘贴在下面
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
并非所有错误都生而平等
并非所有错误都可以立即修复。正如所有人造事物一样,没有什么是100%可靠的。所以现在我们必须手动处理下面的例子……暂时是这样。
实现接口
C#不需要在必需的subs或functions之后添加implement语句。目前,这必须在
VBnet
中手动完成。C#也不需要(Handles
)语句,但在将VB转换为C#时,它会显示一个错误消息说明这一点,并且对于Implements
子句也是如此。AddHandler, AddressOf....已更新
在C#中,
Addhandler Statement
看起来像这样……(Sub.Event += New(SomeTypeOfEventArgs)Sub_Event
)当从C#转换时,这可能被视为一个加法。在与Expresso进行了一些尝试之后,我终于找到了一个正则表达式字符串,可以找到C#代码Sub.Event += New(SomeTypeOfEventArgs)Sub_Event
。下面是如何修复 bisher所有代码转换器都未能解决的,从C#转换到VB的AddHandler, AddressOf
语句。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
在使用ICsharp.NRefactory.dll进行转换后,我进行了一个POST转换修复,使用正则表达式字符串来修复当前转换的VB代码。我还在此次升级中添加了许多后处理修复。我还有很长的路要走才能完成后处理修复,我一直在努力编码。我最终会完成的!!!
如果您没有下面的应用程序和DLL,请获取它们,因为您将需要它们。它们都是免费的。
关注点
- SharpDevelop 3.2
- SharpDevelop 4.0
- CodeConvert
- FastColoredTextBox
- Notepad++ 5.9.3
- Expresso Regex Editor
- Econ.NetVert.Dll by Deniz Ezen
历史
添加了一些额外的subs来进行当前代码的后处理。删除了可能令之前下载过该应用程序的某些或所有用户感到恼火的图片。为此失误表示歉意。
VBFixIt Sub
现在拥有超过14,500到15,000个转换后的修复,使用regex strings
- 上传于 2011-09-26
- 上传于 2011-10-04
- 上传于 2012-04-03
- 上传于 2012-04-05
- 上传于 2012-04-08
- 上传于 2012-04-12,修复了正则表达式字符串中的一些逻辑错误。
- 上传于 2012-04-18,稍微更改了UI并添加了更多正则表达式字符串。
这应该是最后一次更新了。可能不会。我已经完成了所有工具箱组件的EVENTARGS添加,大约15,000个,并且随着我发现C#程序员编写某些代码片段的不同方式(AddHandler
,RemoveHandler
,BeginEnvoke
,…)还在继续添加。如果任何C#程序员发现编写代码片段的不同方式,请通过电子邮件发送代码给我,以便我将其添加到应用程序中。我希望大家都能喜欢这个应用程序,并希望它能为您带来非常好的用途。
如果本文中有任何听起来有些重复的地方,那很可能是,所以请不要留言指出,因为我已经知道了。