Visual Basicを取り除く

画像

そのため、2つのプロジェクトをVBからC#に移行することに決めたときに転換点が訪れました。 誰が気にする-私は猫をお願いします。

はじめに


これらのプロジェクトは、契約組織から5〜6年かけて作成しました。 Visual Studioのメトリック評価ツールによると、これは合計で約150万行のコードであり、そのうち約30%がC#にあり、残りはVBにあります。 なぜこれを行うことにしたのですか?! 最も可能性が高いのは、VBでの作業に消極的であり、優れたvb開発者がいないためです。

私たちの経営陣がプロジェクトの完全な翻訳に設定した締め切りは、容赦なくゼロに近いものを求めており、契約組織の同僚も急いでこれらのプロジェクトに加わり、安reliefのため息をつきました。 緊急の問題をすべて脇に置いて、数回の会議に出席した後、このアイデアの実装に着手しました。

準備する


すべてのビジネスはこれから始まります。 制限時間と黄金の針があっても 、すぐに戦闘に突入しないでください、私たちは同じことをしました。

言語の特定の違いのため、事前に変換のためにプロジェクトを準備する必要があります。 いくつかの段階を特定しました。その後、変換プロセスは比較的簡単になります。

なぜ相対的なのですか?! はい、変換後、いずれの場合でも、不明なプログラムの動作のメモがあるためです。 コードが100%テストでカバーされていない場合、これはすぐに表示されます。 私たちの場合、テストはまったくないので、一般的にテストについては何も言いません。 それでは-特定したステップを検討してください。

1)変換するツールの選択

これは、切断の速度と品質がどちらを選択したかによって異なるため、このような難しいパスでは非常に重要な段階です。 多数のGoogleの質問と会議の後、Instant CSharpとSharpDevelopバージョン4.x(バージョン5.xの変換はサポートされていません)という2つの製品に決着しました。これは非常に奇妙なソリューションです。

SharpDevelopは無料です-これは間違いなくプラスですが、Instant CSharpには無料版があり、有料版と機能に違いはありません。変換されたプロジェクトの行数に制限があります。 Instant CSharpの利点は、WinFormsの変換効率が高いことです。 彼にはマイナスもあります 。これはUTFファイルのみの正しい変換です

小さなプロジェクトにはInstant CSharpを使用し、その他のすべてにはSharpDevelopを使用することにしました。

2)VBプロジェクトのリストのコンパイルと依存関係図の作成

このステップは、どちらの側から作業を開始するかを明確に理解するために必要です。 取得した依存関係図の1つの例を示します。

画像

このチャートには、プロジェクト間の依存関係の数も表示されます。 図から、物事の論理から、プロジェクトの変換の順序は、依存関係の少ないプロジェクトから依存関係の多いプロジェクトへの順序であることが明らかです。

3)ReDimをArray.Resize()に置き換える

この置換を実装するために、小さなReクラスが作成されました。

Public Class Re Public Shared Sub [Dim](Of T)(ByRef Source As T(), HighBound As Integer) //   DimPreserve(Source, HighBound) //  Array.Clear(Source, 0, HighBound + 1) End Sub Public Shared Sub DimPreserve(Of T)(ByRef Source As T(), HighBound As Integer) //   Array.Resize(Source, HighBound + 1) End Sub End Class 

さらに、ReDim Preserve X(N)へのすべての呼び出しはRe.DimPreserve(X、N)に置き換えられ、ReDim X(N)はRe.Dim(X、N)に置き換えられました。

4)厳密なコンパイルオプションの有効化

既定では、.NET Visual BasicまたはVisual Basicコンパイラは厳密な型指定を提供しません。 このデフォルトの動作を変更するには、[コンパイル]タブのプロジェクトプロパティで、[オプションの厳密]をオンに設定します。 その後、発生したすべてのエラーを修正します。

以下の点は、簡単でわかりやすいため、一目瞭然です。 ReSharperを選択し、以下に説明するすべてのポイントを音速(またはそれ以上)で実行します。

5)値型変数の場合、NothingをDefaultに置き換えます
6)AndAlsoおよびOrElseでのAndの置き換え
7)クラスを構成するインポートの削除
8).Method形式のメソッドへの呼び出しを.Method()に置き換える
9)Exit Tryコンストラクトの削除
10)文字列変数の比較をNothingまたは ""またはString.EmptyをString.IsNullOrEmpty()に置き換える
11)メソッドパラメータの不要なByRefディレクティブをByValに置き換える
12)独自のクラスの名前を持つメソッドの名前変更
13)VBコードでの大文字と小文字を区別しない誤った呼び出しの修正

変換


そして、最終段階である変換段階に至りました。 ツールが選択され、プロジェクトが準備され、その運命を待っています。

さあ、始めましょう!

変換プロセスは、Hello Worldプログラムほど複雑ではなく、少し時間がかかります。 SharpDevelopおよびInstant CSharpでこれを行う方法に関する小さなチュートリアルを次に示します。

SharpDevelopで変換する
1. VB.NETプロジェクトを別のフォルダーにコピーします
2. SharpDevelopでプロジェクトを開きます(ファイル->開く->プロジェクト/ソリューション)
3.プロジェクトを変換します(Project-> Convert-> From From VB.NET to C#)
4. Visual Studioでメインソリューションを開き、VB.NETプロジェクトを削除します
5. VB.NETプロジェクトのあるフォルダーを削除します
6. C#で変換されたプロジェクトのフォルダーとファイルの名前を変更します(Convertedという単語を削除します)
7.新しいプロジェクトのフォルダーをメインソリューションのディレクトリにコピーします
8.コピーしたプロジェクトをソリューションに追加します
9.古いプロジェクト(VB.NET)へのリンクがある他のすべてのプロジェクトに、新しいプロジェクト(C#)へのリンクを追加します。 これを行うには、バージョン管理システムツールを使用して、* .csprojおよび* .vbprojファイルの変更を表示できます。
10.プロジェクトをコンパイルしてみます。 正しいエラー

Instant CSharpで変換する
Instant CSharpはANSIは関係ないため、最初にソースファイルのエンコーディングをUTF8に変換する必要があります。
便利なユーティリティUTFCast Express
1. UTFCast Expressを開きます
2. [ソースディレクトリ]フィールドで、プロジェクトディレクトリへのパスを指定します
3. [ターゲットディレクトリ]フィールドで、UTF8エンコーディングのプロジェクトファイルの移動先ディレクトリへのパスを指定します
4.未変換のコピーオプションを設定し、変換を開始します

そして、タンバリンとのこれらのダンスの後、プロジェクトを変換できます。

1. Instant CSharpを開きます
2. VBプロジェクトまたはソリューション:フィールドで、* .vbprojプロジェクトファイルへのパスを指定します
3. C#ターゲットフォルダー:フィールドで、C#に変換されたプロジェクトが保存されるディレクトリを指定します。
4.プロジェクトを変換します(Project-> Convert-> From From VB.NET to C#)
5. Visual Studioでメインソリューションを開き、VB.NETプロジェクトを削除します
6. VB.NETプロジェクトのあるフォルダーを削除します
7.新しいプロジェクトのフォルダーをメインソリューションのディレクトリにコピーします
8.コピーしたプロジェクトをソリューションに追加します
9.古いプロジェクト(VB.NET)へのリンクがある他のすべてのプロジェクトに、新しいプロジェクト(C#)へのリンクを追加します。 これを行うには、バージョン管理システムツールを使用して、* .csprojおよび* .vbprojファイルの変更を表示できます。
10.プロジェクトをコンパイルしてみます。 正しいエラー

おわりに


その結果、両方のプロジェクトを完全にc#に移行しました。今では、広告ではコードリファクタリングは言われませんが、 ReSharperはこの問題に置き換えられません。 操作中に、変換に関連するエラーがポップアップすることがありますが、これは避けられないことです。

親愛なるホーカーの皆さんにとって、私たちの小さな経験が役に立つことを願っています。

参照資料


インスタントcsharp
シャープ開発

Source: https://habr.com/ru/post/J277055/


All Articles