C#への自動変換
- 方法1: SharpDevelopでプロジェクトをコンバートする。
- 方法2: ビルドしたアセンブリ(.exeや.dll)をILSpyで逆コンパイルする。
方法1はソースレベルでの変換のため可読性は高い(コメントも保持される)が、ビルドエラーが多発する。On Error Goto文やLike演算子などC#がサポートしない文法を用いている箇所はエラーになる。VBでは許される明示的でない型変換などもエラーになるので修正が必要になる。フォームデザイナによるフォームのデザイン編集はいちおう維持されるが、かなり修正が必要 (後述)
方法2は逆コンパイルのため等価なソースにはなるが可読性は低い。当然ながらコメントは消える。ILからの逆コンパイルのため、変数名などは維持される。フォームデザイナでフォームのデザインを編集できなくなる。またリソースの参照情報も失われる。
いずれも一長一短であり、完璧な変換にはならない。
SharpDevelopでプロジェクトをコンバート
- SharpDevelopはオープンソースの.NETのIDE。
- VBからC#へのコンバート機能がある(あった)。
- ただし最新版ではコンバート機能がなくなっているので、バージョン4.4を用いる。
- バージョン4.4を下記からダウンロードしてインストールする。
- 変換元のソリューションファイルとプロジェクトファイルのバージョン番号を改竄する。(古いソフトのため最新のVisualStudioで作成されたソリューション/プロジェクトを開くとエラーになる)
ソリューションファイル
VisualStudioVersion = 16.0.29409.12 ← 16を12に改竄する
プロジェクトファイル
<Project ToolsVersion="15.0" … ← 15を4に改竄する
- SharpDevelop 4.4 でソリューションを開き、[Project]→[Convert]→[From VB.NET to C#]
- 同じソリューション内にC#のプロジェクトが生成される。
- SharpDevelopを終了し、ソリューションと変換前後のプロジェクトの改竄を元に戻す。
- VisualStuduoでソリューションを開き、ビルドしてみる。(たぶんエラーが多発する。)
- あとは手動で修正する。
【参考記事】
コンバートの前に
VB.NETのコードに Option Explicit On を追加して、曖昧な型を使用している箇所をチェックしてあらかじめ修正して動作確認しておいたほうがコンバート後の修正が減ってラクかもしれない。
コードの修正
型変換
- VBでは数値型⇔文字列型の暗黙の変換が許されるが、C#ではエラーになる。
- 数値⇒文字列の変換はToStringを使う
- 文字列⇒数値の変換はParseを使う
- 【参考記事】UARTおじさんのためのチートシート - 滴了庵日録
- long型⇔int型の暗黙の変換すらC#ではエラーになるので、明示的にキャストする。
- 代入文だけでなく、比較演算子でも型の不一致はエラーになる。
動的型
Exit ForとExit Do, Continue ForとContinue Do
On Error GoTo文
- On Error GoTo文を用いたエラー処理は try / catch文による構造化例外処理に書き換える。
引数の省略
My
- My はVB固有の機能。C#には無い。
- .NET クラス・ライブラリへのアクセスを簡便化してくれるユーティリティー群。
- My.Computer, My.User, My.Application, My.Settings など。
- SharpDevelop 4.4でVB⇒C#コンバートすると、My を提供するソースが生成される。
- しかし、ツールの不具合のためか、ビルドエラーになることがある。
- My を使う必要が無ければプロジェクトを新規に作り直してソースを移したほうが早いか。
- 【参考記事】Visual Basic 2008のMy機能を使いこなそう - @IT
- 【参考記事】C#からVBのMy機能を利用するには?[2.0のみ、VS 2005のみ、C#] - @IT
フォームデザインの修正
フォームのソースは *.cs と *.Designer.cs に分けて変換されるが、変換に不具合があるのかフォームデザイナで開くと「データが失われる可能性を防ぐため、デザイナーの読み込み前に以下のエラーを解決する必要があります。 」と表示される。
*.Designer.cs をエディタで開いてみると、コントロールの宣言が奇妙なことになっているので修正する。以下に修正の例を示す。ただし修正をするとイベントハンドラの紐づけが失われるので、再設定する必要がある。
【修正前】
private System.Windows.Forms.Button withEventsField_btn_Cancel; public System.Windows.Forms.Button btn_Cancel { get { return withEventsField_btn_Cancel; } set { if (withEventsField_btn_Cancel != null) { withEventsField_btn_Cancel.Click -= btn_Cancel_Click; } } …(中略)... }
【修正後】
private System.Windows.Forms.Button btn_Cancel ;