久しぶりに「ExpTreeLib」を使用して、アプリを作成しようとしてみたら、ツールボックスに追加することができなくなっていました。
ちなみに、ExpTreeLibは、簡単にエクスプローラ風のツリー表示を追加できるライブラリです。
どうやら .Net Framework で作成されている ExpTreeLib は、.NET のプロジェクトに使用できないらしいです。
.NET が主流になったので、どうせなら新しい環境で ExpTreeLibを使いたいです。
ということで頑張って .NET に移行することができたので、メモとして残しておきます。
ExpTreeLibの取得
まず、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」をインストールします。
下記のページを参照して、インストールを行っていきます。
Visual Studioのメニュー → 「拡張機能」→ 「拡張機能の管理」を選択します。
「拡張機能マネージャー」が表示されるので、「参照」タブを選択して、「検索ボックス」に「.NET Upgrade Assistant」と入力します。

表示された項目から「.NET Upgrade Assistant」を選択して、「インストール」ボタンを押下します。
インストールが終わったら、いったんVisual Studioを終了します。
Visual Studioが閉じて、下記のダイアログが表示されたら「Modify」ボタンを押下します。このあとにインストールが行われるようです。

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

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

アップグレード処理
.NET Upgrade Assistant を使用してプロジェクトをアップグレードしていきます。
アップグレードを行う前に、念のためバックアップを取っておいた方がよさそうです。
下記のサイトを参照してください。
.NET Upgrade Assistant を使用してプロジェクトをアップグレード
ソリューションエクスプローラーから、各プロジェクトを1個づつアップグレードしていきます。
以下の順で、アップグレードしていきます。
- ExpTreeLib
- ExpListLib
- Demo_CS
- 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のページを参照してみたところ、文字エンコーディングの登録処理を行うメソッドのようです。
どうやら、サポートされていないプラットフォーム(.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のパッケージ化
- 新規プロジェクト作成とパッケージのインストール
手順はかなり多かったのですが、一つ一つの工程はそこまで難しくなく、想定していたより問題が少なかったので良かったです。