「.NET 5」対応

今まで.NETのソフトを結構作ってきたけど、それらはほぼ「.NET Framework」上で動作するものだった。
が、しかし、この「.NET Framework」が今後のOSでは無くなるらしい。
ここ最近、全く勉強不足でそんなこと知らなかった。

「.NET 5」に統合されていくとのこと。
で、その.NET 5は2020年11月10日に正式リリース済み。

かつてのVisual Basic 6が、Visual Basic.NETに代わり、実質VB6が絶滅した時と同じか!?
(必須ランタイムもVB6ランタイムから、.NET Frameworkに変更)

これはまずい。

今更ながら調べ始めてみると、ASP.NETは、ほぼ移行不可能らしい。ひどい。
で、肝心なWindowsデスクトップアプリ(Formアプリケーション)は、どうかというと、
一応、.NET 5(.NET Core3相当)でも存在するらしい。

ただ、大元がMono Project(.NET Frameworkの互換OSS版)の物らしく、一部、機能差があったり表示崩れがある模様。

悪い事ばかりではない。
今まで、Windowsでしか動作しなかった.NET Frameworkのアプリが、Linuxや、Macで動くようになる。
更に.NET 6ではモバイルでも動作するらしい。

まぁ、でも自作ソフトの場合、ほぼ全てWindows固有の機能を使っているので、他プラットフォームでは動かない。
でも、Windowsだけでも今まで通り動かすことができそうなので助かった。

という訳で、本当に動くのか動作検証を兼ね小さなアプリで実験開始。


.NET Framework用のアプリで、作りかけてボツにしていた小さなソフトがあったので、それで実験。

まだソースは100Step程度。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices; // DLL Import
using System.Runtime.CompilerServices;
using System.Reflection;
using System.IO;

namespace DeskPet
{
    public partial class PetForm : Form
    {
        [StructLayout(LayoutKind.Sequential, Pack = 4)]
        private struct RECT
        {
            public int left;
            public int top;
            public int right;
            public int bottom;
        }

        [DllImport("User32.Dll")]
        static extern int GetWindowRect(IntPtr hWnd, out RECT rect);

        [DllImport("user32.dll")]
        extern static IntPtr GetForegroundWindow();

        public PetForm()
        {
            InitializeComponent();
        }

        int imgLeft = 0;
        int imgTop = -118;

        private void PetForm_Load(object sender, EventArgs e)
        {
            // 埋め込みリソースを取得
            Assembly assembly = Assembly.GetExecutingAssembly();
            Stream stream = assembly.GetManifestResourceStream("DeskPet.image.png");
            Image img = Image.FromStream(stream);

            //string imageFile = @"image.png";
            //Image img = Image.FromFile(imageFile);

            // イメージ追加
            imageList1.Images.Add(img);
            imageList1.ImageSize = new Size(img.Width, img.Height);
            this.Width = img.Width;
            this.Height = img.Height;
            this.BackgroundImage = imageList1.Images[0];

            // 最初は画面中央表示
            this.Left = (Screen.PrimaryScreen.Bounds.Width - this.Width) / 2;
            this.Top = (Screen.PrimaryScreen.Bounds.Height - this.Height) / 2;

            this.TransparencyKey = SystemColors.Control;
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            // アクティブなウィンドウの座標取得
            RECT r;
            IntPtr active = GetForegroundWindow();
            GetWindowRect(active, out r);

            // このアプリ以外がアクティブの場合、座標移動
            if (Form.ActiveForm == null)
            {
                this.Left = r.left + imgLeft;
                this.Top = r.top + imgTop;
            }

            // 非アクティブ(デスクトップ自体がアクティブ)の場合、非表示化
            if (r.left <= 0 && r.top <= 0)
            {
                this.Visible = false;
            }
            else
            {
                this.Visible = true;
            }
        }

        private void 終了XToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}

.NET Framework用に作ったソースをそのまま.NET 5に移行してみる。

 
 

まずは、開発環境であるVisual Studio 2019をアップデート。
.NET 5対応版は、「Visual Studio 2019 16.8」とのこと。

これで、既存ソリューションを開いて、.NET 5用にビルドしてみようとしてみたが、「対象のフレームワーク」に「.NET 5.0」等が出てこない。。
そんな単純な話ではないらしい。

↑対象フレームワークは、.NET Framework 4.7.2まで。
ちなみに、.NET Frameworkの最終版は4.8とのこと。

簡単に.NET 5に変換してくれるコンバーターのような物も無いらしい。

 

なので、渋々新規作成から。

 

新しいプロジェクトの作成では、滅茶苦茶テンプレートが沢山出てくるので、フィルターで言語「C#」、プラットフォーム「Windows」、プロジェクトの種類「デスクトップ」を選択し、出てきた「Windows Forms App (.NET)」を選択。
(ちなみに既存のアプリは「Windows フォームアプリケーション(.NET Framework)」らしいので、こちらを選ばないよう注意)

 

プロジェクトの構成。
こちらは今まで通り。

 

すると、.NET5用のソリューションが作成される。
ここも.NET Frameworkとほぼ一緒。

 

「プロジェクト」>「プロパティ」メニューを開き「アプリケーション」タブを開き、「対象フレームワーク」を確認してみると、「.NET Core 3.1」が選択されている。
コンボボックスを開いてみると、今回のお目当て「.NET 5.0」が出てくる。
(このことからも、「.NET 5」は「.NET Core」(Mono)ベースで、.NET Frameworkとは別系統の流れと分かる)

 

あとは、.NET Framework用で作成したときのように、ソースを書いて、プロパティ変更したり、イベント作成したり、リソース埋め込みとかアイコン設定とか一通り行う。

ここがやっぱり一番面倒。
プロパティとかも微妙に.NET Framework版と異なる。
一部、英語表記も残っていたり、まだ発展途上かも知れない。
そのうち、一発変換してくれるコンバーターとか出るのかな?出してほしいな。

 

そして、バージョン情報の設定か所もちょっと違う。

.NET Framework版の頃は「アプリケーション」タブ内の「アセンブリ情報」ボタンから、バージョン番号(アセンブリバージョン、ファイルバージョン)を指定していたけど、.NET 5版では「パッケージ」タブ内でバージョン番号(パッケージバージョン、アセンブリバージョン、ファイルバージョン)を指定するようになっている。

 

これで、ビルドしてみる。

と、出来上がったファイルも異なる。

.NET Framework版は、

  • DeskPet.exe
  • DeskPet.exe.config
  • DeskPet.pdb

.NET 5版では、

  • ref\DeskPet.dll
  • DeskPet.deps.json
  • DeskPet.dll
  • DeskPet.exe
  • DeskPet.pdb
  • DeskPet.runtimeconfig.dev.json
  • DeskPet.runtimeconfig.json

が生成される。

refフォルダや、pdbファイルは配布不要かも知れないが、.NET 5版では生成ファイルが増えている。
※「DeskPet」はプロジェクト名

 

で、生成したファイルが、他のPCでも動くのか確認してみる。
新規Windows 10端末を想定し、前に試した「Windows Sandbox」上で確認してみる。

真っ新な環境では、.NET 5.0 Desktop Runtimeが無いため、このようなエラーのメッセージボックスが表示される。
「To run this application, you must install .NET.
 Would you like to download it now?」

.NET無いからダウンロードする?

ここで「はい」をクリックすると.NET 5.0ランタイムのダウンロードサイトに遷移する。

対象プラットフォームのランタイムをダウンロードしインストール。

 

これだけで、.NET 5用のランタイムはインストールできるので、後はexeを実行するのみ。

アクティブなウインドウの上に犬が乗っかるだけのソフト。
無事、.NET 5で動作することを確認。
デスクペット

ついでに、今回のソフトを先ほど公開しました。
⇒「デスクペット

 
 

それにしても、.NET 5は、VB6 ⇒ VB.NET の時のような最悪な結末に至らなくて本当によかった。
自作ソフトが、.NET Frameworkと共に息絶えるのかと思ってしまった。

 
 

まだVisual Studioの方も、途中で「致命的なエラー」なんてものが出る場面もあったので、不安定かも知れない。

 
 

いろいろ、文句は言いつつも.NET 5/6に全プラットフォームを統合するという動きは、.NET当初の目標がようやく叶い、開発者にとっても嬉しい話なのかも知れない。
各プラットフォームで1つ1つ開発する手間が省ける。

もともとJavaはそうだったかも知れないけど、.NETも本来の意味での.NETになってきた。

今まではWindows向けにしか自作ソフトを作ってこなかったけど、今後は他プラットフォームで動くソフトも挑戦してみようかな。

 
 

Leave a comment

メールアドレスが公開されることはありません。

CAPTCHA


*