C#

ExpTreeLib を .Net Framework から .NET へ移行するメモ

久しぶりに「ExpTreeLib」を使用して、アプリを作成しようとしてみたら、ツールボックスに追加することができなくなっていました。

ちなみに、ExpTreeLibは、簡単にエクスプローラ風のツリー表示を追加できるライブラリです。

どうやら .Net Framework で作成されている ExpTreeLib は、.NET のプロジェクトに使用できないらしいです。

.NET が主流になったので、どうせなら新しい環境で ExpTreeLibを使いたいです。

ということで頑張って .NET に移行することができたので、メモとして残しておきます。

ExpTreeLibの取得

まず、ExpTreeLibのプロジェクトを以下から取得します。

GitHub-ExpTreeLib

圧縮ファイルを解凍して、ExpTreeLib のプロジェクトを開きます。

とりあえず、.NET Framework のバージョンのまま起動確認します。

ExpTreeLib.sln を起動すると、バージョン移行のダイアログが表示されます。

「対象を .NET Framework 4.8 に更新する」を選択して、「続行」ボタンを押下します。

以下4つのプロジェクトについて、ダイアログが表示されるので、4回とも全て「続行」ボタンを押下します。

  • Demo_CS
  • Demo_VB
  • ExpListLib
  • ExpTreeLib

移行が完了すると、プロジェクトが開きます。

しかし、そのままデバッグを行うとエラーが出てしまいます。

なので、ソリューションエクスプローラの「ExpTreeLib」、次に「ExpListLib」の順に、各プロジェクトを右クリックしてメニューを表示し、「リビルド」を実行します。

ビルドが正常に終了したら、Demo_CS の プロジェクトを選択して、デバッグします。

以下の画面が表示されたら、まずは起動確認OKです。

準備は以上です。

.NET Framework から .NET へ移行

.NET Framework から .NETへ移行していきます。

準備

まずは、「.NET Upgrade Assistant」をインストールします。

下記のページを参照して、インストールを行っていきます。

.NET Upgrade Assistant インストール

Visual Studioのメニュー → 「拡張機能」→ 「拡張機能の管理」を選択します。

「拡張機能マネージャー」が表示されるので、「参照」タブを選択して、「検索ボックス」に「.NET Upgrade Assistant」と入力します。

表示された項目から「.NET Upgrade Assistant」を選択して、「インストール」ボタンを押下します。

インストールが終わったら、いったんVisual Studioを終了します。

Visual Studioが閉じて、下記のダイアログが表示されたら「Modify」ボタンを押下します。このあとにインストールが行われるようです。

インストールが完了しました。

「ExpTreeLib」のプロジェクトを再度起動します。

ソリューションエクスプローラで「ソリューション」を右クリックして、表示されたメニューに「アップグレード」があれば、インストール完了です。

アップグレード処理

.NET Upgrade Assistant を使用してプロジェクトをアップグレードしていきます。

アップグレードを行う前に、念のためバックアップを取っておいた方がよさそうです

下記のサイトを参照してください。

.NET Upgrade Assistant を使用してプロジェクトをアップグレード

ソリューションエクスプローラーから、各プロジェクトを1個づつアップグレードしていきます。

以下の順で、アップグレードしていきます。

  1. ExpTreeLib
  2. ExpListLib
  3. Demo_CS
  4. Demo_VB

まずは、「ExpTreeLib」を右クリックして、アップグレードを選択します。

アップグレードアシスタント画面が表示されます。

「所定の位置のプロジェクトのアップグレード」を選択します。

優先するターゲットフレームワークに、「.NET 8.0」を選択して、次へボタンを押下します。

アップグレードするコンポーネントを選択しますと聞かれるので、全てチェックされている状態で、「アップグレードの選択ボタン」を押下します。

アップグレードが終了しました。

この操作を他の3つのプロジェクトにも行っていきます。

以上でアップグレードは終了です。

アップグレード後のプロジェクトのビルド

アップグレードが完了したので、動作確認をしてみます。

とりあえず、「ExpTreeLib」と「ExpListLib」をリビルドします。

ExpTreeLibのビルド

まず、「ExpTreeLib」をリビルドすると1件エラーが出ました。

エラーは「ExpTree.vb」に出ています。VBのソースです。

「Windows.Forms」の前に「System.」を追加するとエラーが消えます。

再度ビルドを行うとエラーが消えたみたいです。

ExpListLibのビルド

次に、「ExpListLib」をリビルドします。

大量のエラーがでました。泣きそうです。

とりあえず「ExpTreeLib」のライブラリの参照ができていないようなので、依存関係を追加します。

「ExpListLib」のプロジェクトを右クリックして、「追加」→「プロジェクトの参照」を選択します。

表示されたウィンドウで、「ExpTreeLib」のプロジェクトにチェックを入れて「OK」ボタンを押下します。

再度ビルドを行います。まだエラーが残っているので、確認します。

「ExpList.Designer.vb」にエラーが出ているようですが、先ほどと同じ様なエラーです。

「Windows.Forms」の前に「System.」を追加するとエラーが消えます。

再度ビルドを行います。エラーが残っていますので、再び確認します。

どうやら同じようなエラーが「ExpList.vb」に出ています。

「Windows.Forms」の前に「System.」を追加するとエラーが消えます。

再度ビルドを行うと、全てのエラーが消えました。良かったです。

Demo_CSのビルド

「Demo_CS」をビルドします。少しですがエラーがでました。

「ExpTreeLib」と「ExpListLib」のライブラリの参照ができていないようなので、先ほどと同じように依存関係を追加します。

「Demo_CS」のプロジェクトを右クリックして、「追加」→「プロジェクトの参照」を選択します。

「ExpTreeLib」と「ExpListLib」にチェックを入れて「OK」ボタンを押下します。

再度ビルドを行うとエラーが全て消えました。

Demo_VBのビルド

「Demo_VB」をビルドします。少しですがエラーがでました。「Demo_CS」の時と同じように参照ができていないようです。

「ExpTreeLib」と「ExpListLib」を参照して、再度ビルドを行います。

以上で全てのプロジェクトのビルドが完了です。

アップグレード後の動作確認

ビルドが正常に終了したら、Demo_CS の プロジェクトを選択して、デバッグします。

デバッグを開始すると、すぐに下記のエラーで止まります。

「StringLogicalComparer.vb」で発生しているエラーで、エラー内容は以下になります。

【エラー内容】

No data is available for encoding 932. For information on defining a custom encoding, see the documentation for the Encoding.RegisterProvider method.

【Google翻訳】

エンコーディング 932 に使用できるデータがありません。カスタム エンコーディングの定義については、Encoding.RegisterProvider メソッドのドキュメントを参照してください。

下記のEncoding.RegisterProviderのページを参照してみたところ、文字エンコーディングの登録処理を行うメソッドのようです。

Encoding.RegisterProvider

どうやら、サポートされていないプラットフォーム(.NETのこと?)では、文字エンコーディングを使用できるように、クラスを登録しないといけないようです。

いろいろ調べた結果、以下の処理を追加すれば良さそうです。

Encoding.RegisterProvider(CodePagesEncodingProvider.Instance)

「CodePagesEncodingProvider.Instance」は、デスクトップの .NET Framework ではサポートされているものの現在のプラットフォームではサポートされていないコード ページのエンコーディング プロバイダーを取得します。(CodePagesEncodingProvider.Instance

とりあえず、「StringLogicalComparer.vb」の97行目、「While」の上に追加してみます。

このままだとエラーになるので、プログラムの最初に「Imports System.Text」を追加してください。

上記のコードを追加したら、動作確認をします。

デバッグを行い、下記のようにウィンドウが表示されたら成功です。

移行したExpTreeLibを使用してみる

.NET に移行したExpTreeLibが実際に使用できるか確認します。

ツールボックスに「ExpTreeLib」を登録していきます。

今まで通りに、以下の手順でツールボックスに登録をしようとするとエラーになります。

まずは、ExpTreeLibのプロジェクトをビルドして「DLL」を作成します。

次に何でもよいので、.NETのプロジェクトを新規作成します。

フォームのデザイン画面で、ツールボックスを開いて、一番下にある「全般」のところで右クリックします。

表示されたメニューから、「アイテムの選択」をクリックすると「ツールボックス アイテムの選択」ウィンドウが表示されます。

「参照」ボタンを押下して、先ほど作成した「ExpTreeLib」のDLLを選択します。

そうすると、エラーになります。

「ツールボックス項目を動的に列挙できないプラットフォームを対象としています。」

はい、ダメでした。あれっ、何で?。

パッケージ化の準備

Webで検索してみたところ、「パッケージのインストール」という形であれば、ツールボックスへの登録ができるようです。

手順を以下に記載いたします。

まず、プロジェクトのパッケージ化の準備をします。

パッケージ化する際に、設定される項目「タイトル」、「作成者」などの情報は、プロジェクトのプロパティで設定・確認できます。

「ExpTreeLib」のプロジェクトを右クリックして、表示されたメニューの「プロパティ」を選択します。

表示されたプロパティのメニューにある「パッケージ」を選択すると、パッケージの内容が確認できます。

必要な項目は更新してください。今回は、そのまま入力されている情報を使用しています。

次に、Visual Studioの「メニュー」→「ツール」→「Nuget パッケージ マネージャー」→「パッケージ マネージャー設定」を選択します。

表示されたオプションウィンドウのメニューから、「Nuget パッケージ マネージャー」→「全般」を選択します。

ウィンドウ右側に表示されている「パッケージの管理」コンボボックスから「PackageReference」を選択します。

「Visual Studio 2017 バージョン 15.7 以降では、packages.config 管理形式から PackageReference 形式へのプロジェクトの移行がサポートされています。」とのことです。

とりあえず、PackageReferenceを選択すると、利点があるようなので変更しています。

パッケージソースの場所を設定

Nugetでインストールされるパッケージを保存する場所を追加していきます。

この設定で、Webからパッケージを取得するのではなく、ローカルフォルダからもパッケージを取得できるようになります。

ウィンドウ左側のメニューから、「Nuget パッケージ マネージャー」→「パッケージソース」を選択します。

ウィンドウ右側に表示されているパッケージソースの右上にある「+」ボタンを押下して、パッケージソースを追加します。

右下の「…」ボタンを押下して、パッケージソースの場所をローカルの適当なフォルダに変更します。

変更が完了したら「OK」ボタンを押下して、ウィンドウを閉じます。

以上で、設定は完了です。

パッケージの作成

パッケージの作成を行います。

ソリューションエクスプローラーの「ExpTreeLib」プロジェクトを右クリックして表示されたメニューから、「パック」を選択します。

そうすると、以下の場所にパッケージが作成されます。

フォルダ:\ExpTreeLib-main\ExpTreeLib\bin\

ファイル:ExpTreeLib.1.0.0.nupkg

「nupkg」ファイルは、解凍ツールでファイルを解凍して、中身が確認できるようです。

ちなみに、拡張子を「ZIP」にしても、圧縮ファイル扱いで処理ができます。

試しに解凍したところ、以下のようなフォルダ構造になっていました。

「lib」フォルダの中には、ちゃんと「ExpTreeLib.dll」が入っています。

パッケージが作成できたら、先ほど設定したパッケージソースのローカルフォルダに「ExpTreeLib.1.0.0.nupkg」を格納します。

以上で準備完了です。

作成したパッケージのインストール

それでは、作成したパッケージをインストールします。

何でもよいので、.NETで「Windowsフォームアプリ」のプロジェクトを新規作成します。

フレームワークは、「.NET 8.0」を選択しました。

Visual Studioが起動したら、「メニュー」→「ツール」→「Nuget パッケージ マネージャー」→「ソリューションの Nuget パッケージの管理」を選択します。

「NuGet ソリューション パッケージ管理」が表示されたら、「参照」タブを選択します。

この状態だと、Web上の「.Net Framework」で作成されたものだけが、表示されています。

今回作成したローカルのパッケージフォルダに入れたものが、表示されていません。

なので、右上にある「パッケージソース」コンボボックスから、「Package source」を選択します(名前は自分でつけたものです)。

左側に「ExpTreeLib」が表示されるので、選択します。

選択すると右側にインストール先のプロジェクトが表示されるので、必要なプロジェクトチェックを入れて、「インストール」ボタンを押下します。

「変更のプレビュー」ウィンドウが表示されたら、「適用」ボタンを押下します。

以上でパッケージのインストールは終了です。

Nuget ソリューションの「インストール済み」タブを見てみると、「ExpTreeLib」が追加されていることが確認できます。

ちなみに、この画面で「アンインストール」ができます。

移行したExpTreeLibを使用してみる

移行した「ExpTreeLib」を使用してみます。

Visual Studioのフォームのデザイン画面を表示します。

左側にある「ツールボックス」をクリックすると、「ExpTreeLib」が追加されています。

さっそく選択して、ウィンドウに貼り付けます。

それでは、デバッグをしてみます。

以下のように画面が表示されたら成功です。

長かったです。

まとめ

ExpTreeLibを「.Net Framework」 から 「.NET」 へ移行して、使用するところまで確認しました。

工程としては、以下になります。

  • ExpTreeLibパッケージの取得
  • .NET Upgrade Assistant のインストール
  • ExpTreeLibプロジェクトのアップグレード
  • アップグレードで発生したエラーの解決
  • ExpTreeLibのパッケージ化
  • 新規プロジェクト作成とパッケージのインストール

手順はかなり多かったのですが、一つ一つの工程はそこまで難しくなく、想定していたより問題が少なかったので良かったです。