Porting Assistant for .NET をCLIで使う

今回は、AWSからリリースされている「Porting Assistant for .NET」をコマンドラインで実行することに挑戦しました。

「Porting Assistant for .NET」は、.NET Frameworkで開発されたアプリケーションを .NET Coreに移植するためのサポートツールです。無料で使用できます。

GUIアプリケーションを利用した記事はありましたが、OSSなのでコマンドでも実行できるツールを試しました。

# 利用するツール・動作要件

Code translation assistant https://github.com/aws/cta
を利用します。

Visual Studio が必要です。個人利用であればコミュニティ版などを事前に準備しておきましょう。

今回は以下の環境を利用しました。
Visual Studio: Visual Studio 2022 コミュニティ版

# ダウンロードとコンパイル

CTA の[サイト](https://github.com/aws/cta) https://github.com/aws/cta からリポジトリURLをコピーして git clone を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/237a4122-d5eb-e3cc-750c-09257ef87ac7.png)

src フォルダの CTA.Rules.sln　ソリューションを Visual Studio で開きます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/45b0ea65-701f-ab9d-de85-e63a341b0a88.png)

メニューからソリューションのビルドを実行します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/5e27b1f0-1057-8131-37b6-03e42031e025.png)

コンパイルが完了しました。今回はデバッグビルドで進めました。

# 作成された実行モジュールと実行

コマンドで実行するモジュールは CTA.Rules.PortCore に作られます。

フォルダを確認すると以下のように CTA.Rules.PortCore.exe が作成されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/ade01cda-c52e-6933-670b-b9ec578cf8e5.png)

コマンドラインで実行を行ってみます。今回は Visual  Stduio で VB.Net 4.8 のWebForm プロジェクトを指定して変換を行いました。

コマンドプロンプトにて CTA.Rules.PortCore.exe を実行します。
-s 引数に元のVB4プロジェクトのソリューションファイルを指定します。

``` bat
.\CTA.Rules.PortCore.exe -v net8.0 -c true -s C:\Users\masanao\source\repos\ASPNETWebApplication1\ASPNETWebApplication1.sln
```

多くのメッセージ出力して変換が実行されました。

``` bat
info: Translator[0]
      Archive files that are no longer used in core projects.
info: Translator[0]
      Project type: WebForms
info: Translator[0]
      Create appsettings.json file using web.config settings
info: Translator[0]
      Migrate settings from web.config file to appsettings.json.
info: Translator[0]
      Adding reference to packages Microsoft.EntityFrameworkCore
info: Translator[0]
      Migrate csproj file to core.
info: Translator[0]
      Generating Post-Build Report
```

対象となったプロジェクトフォルダの１階層上のフォルダに UUID 形式のフォルダが作成されています。これがアウトプットのフォルダです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/c8cbf6ff-a64b-67a4-d14d-cfec1f30f00d.png)

中を見ると変換が行われていることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/81951beb-5d40-95e3-5c3f-fc81e7710e9c.png)

Pages 配下に Razor ページ・コンポーネントが作成されていることがわかります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/3965c1b4-bc22-f260-8029-7309453c69b1.png)


なお引数のオプションは下記です。

``` bat
 .\CTA.Rules.PortCore.exe --help
CTA.Rules.PortCore 2.12.19-alpha+9ed65afbf6
Amazon Web Services

ERROR(S):
  Option 'd, use-builtin-rules' has no value.

  -p, --project-path         Project file path.

  -s, --solution-path        Solution file path.

  -r, --rules-dir            Directory containing rules json input file(s)

  -d, --use-builtin-rules    Use default rule files

  -a, --assemblies-dir       Action Assemblies Dir

  -v, --version              Version of net core to port to (netcoreapp3.1, net5.0, net6.0, net7.0, net8.0)

  -m, --mock-run             Mock run to generate output only (no changes will be made)

  -c, --create-new           Create a new folder for ported solution

  --help                     Display this help screen.

  --version                  Display version information.
```

# 変換後のルール

コマンドオプションにあるように変換にはルールが利用されます。
ルールはGitHub のドキュメントにもあるように [Porting Assistant for .NET Datastore:](https://github.com/aws/porting-assistant-dotnet-datastore) のjson に基づいているようです。

タグの変換は tagconfigs フォルダにダウンロードされます。これを変更することでタグの変換ルールのカスタマイズができます。

なお、次回はタグのカスタマイズを実施して、ルールのカスタマイズに挑戦してみたいと思います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/141148/b8d4a60c-146a-3c50-5b56-2b3d6f49ae78.png)

asp.textbox.yaml の中身は以下です。

``` yaml 
!Template
TagName: asp:TextBox
CodeBehindType: System.Web.UI.WebControls.TextBox
CodeBehindHandler: Default

Conditions:
  - !HasAttributeWithValue
    AttributeName: TextMode
    AttributeValue: MultiLine
    ForTemplates: [TextArea]
  - !HasAttributeWithValue
    AttributeName: TextMode
    AttributeValue: Password
    ForTemplates: [Password]

Templates:
    TextArea: |
        <textarea
            id=#ID#
            class=#CssClass#
            maxlength=#MaxLength#
            rows=#Rows#
            cols=#Columns#
            @onchange=#OnTextChanged:TextChanged:EventHandler#
            readonly=#ReadOnly:HtmlBoolean#
            disabled=#Enabled:InvertedHtmlBoolean#>
            #Text#
        </textarea>
    Password: |
        <input
            id=#ID#
            class=#CssClass#
            value=#Text#
            maxlength=#MaxLength#
            type="password"
            @onchange=#OnTextChanged:TextChanged:EventHandler#
            readonly=#ReadOnly:HtmlBoolean#
            disabled=#Enabled:InvertedHtmlBoolean#>
    Default: |
        <input
            id=#ID#
            class=#CssClass#
            value=#Text#
            maxlength=#MaxLength#
            type="text"
            @onchange=#OnTextChanged:TextChanged:EventHandler#
            readonly=#ReadOnly:HtmlBoolean#
            disabled=#Enabled:InvertedHtmlBoolean#>
```

# 参考情報

OSSとして公開されている Porting Assistant for .NET のGitHub リポジトリにリンク等がのっています。

https://github.com/aws/porting-assistant-dotnet-client