以下の内容はhttps://let.blog.jp/tag/.NETより取得しました。


.NET Framework と .NET を混ぜて使う
.NET Framework で作られたレガシーなアプリがあって サポート期間とか色々な事情で .NET には移行しない
そのアプリの一部機能を使う別アプリを新規に作るけど 最新 LTS の .NET 6.0 を使いたい
そんなことできるのかなと思って試してみたら普通にできた

ソリューションの中に新規プロジェクトを作るとき .NET のプロジェクトを選ぶ
作ったプロジェクトの依存関係の設定でソリューション内から .NET Framework のアプリを選ぶ

あとは .NET Framework 側のメソッドを単純に呼び出すだけ

WindowsFormsApp1.Class1.something()

これで動いた

ただし WinForms のアプリの Form を開く機能はコンソールアプリからは呼び出せない
コンパイル時にエラーは出ないけど実行時にアセンブリが見つからないってエラーが出る
.NET Framework 側のプロジェクトのビルド時に依存アセンブリは考慮されてそうだけど 見つからないらしい

.NET 側もアプリの種類を WinForms にすれば問題なく開ける
.NET アプリから .NET Framework 経由で Form を開くと .NET Framework アプリでも WinForms のアセンブリは .NET 側の SDK のものが使われてるのかな?

コンソールアプリとしてプロジェクトを作ってしまった場合はプロジェクトのプロパティを開いて 「アプリケーション > 全般」 の部分で以下のように設定すれば使えるようになる

出力の種類 → Windows アプリケーション
ターゲット OS → Windows
Windows フォーム → チェック入れる

WPF なら Windows Presentation Foundation の方にチェック
IronPython3 使ってみた
Python で .NET 機能が使えるというものです
https://github.com/IronLanguages/ironpython3

以前こんな記事を書きました
当時はまだ Python2.7 互換しかありませんでした
さすがに 3 じゃないのは嫌かなと使わなかったのですが 今年 7 月に 3.4 が出ました
本家 Python は 3.11 が Stable なので結構古いのですが それでも 3 系なのは嬉しいところです

とりあえずどんな感じで使えるのか試してみようと思います
ドキュメントにインストール方法があったのでこの通りに進めます
https://github.com/IronLanguages/ironpython3/blob/master/Documentation/installing.md

dotnet コマンドのツールとしてスタンドアロンインタプリタが使えるようです

dotnet tool install --global ironpython.console

グローバルに入れたので ipy コマンドが使えるようになりました
これが普通の python3 や py コマンド相当のもののようです

単純に ipy だけで実行すると REPL が使えます

C:\Users\WDAGUtilityAccount>ipy
IronPython 3.4.1 (3.4.1.1000)
[.NETCoreApp,Version=v6.0 on .NET 6.0.21 (64-bit)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>>

引数に py ファイルを渡すとそのファイルを実行できます

ほぼ普通の Python と同じみたいですね
ライブラリのフォルダは

C:\Users\<USER>\.dotnet\tools\.store\ironpython.console\3.4.1\ironpython.console\3.4.1\tools\net6.0\any\lib

ここに http とか os.py とか glob.py などのパッケージが配置されています
3.4.1 や net6.0 の部分はバージョンで変わるはずです

.NET 機能に触れてみます

C:\Users\WDAGUtilityAccount>ipy
IronPython 3.4.1 (3.4.1.1000)
[.NETCoreApp,Version=v6.0 on .NET 6.0.21 (64-bit)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import System
>>> System
<module 'System' (CLS module from System.Private.CoreLib, Version=6.0.0.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e)>
>>> System.Console
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'System' object has no attribute 'Console'
>>> import clr
>>> clr.AddReference("System.Console")
>>> System.Console
<class 'Console'>
>>> System.Console.WriteLine("a")
a
>>> System.Console.WriteLine("{0} + {1} = {2}", 10, 20, 30)
10 + 20 = 30

.NET の System は 「import System」 でインポートできます
デフォルトで System.Runtime.dll のアセンブリがロードされてるようで System.Array とか System.Activator とかが使えます
System.Console は System.Console.dll なので System.Console にアクセスしても見つかりません
clr.AddReference で参照に追加することで使えるようになります

ただ Python は Python のままでも十分高機能なのでコンソールだとあまり .NET 機能を使える嬉しさがないです
やっぱり GUI を使えてこそだと思うので GUI を試してみようと思います
Readme では WinForms でダイアログを出す例があるのでこれを試してみます

import clr
clr.AddReference("System.Windows.Forms")
from System.Windows.Forms import MessageBox, MessageBoxButtons

MessageBox.Show("Hello World!", "Greetings", MessageBoxButtons.OKCancel)

OSError: [Errno -2146232800] Could not add reference to assembly System.Windows.Forms

アセンブリの読み込みに失敗するようです
WinForms のアセンブリはライブラリに含まれていないのでしょうか
そういえばインストール時に指定した名前は ironpyton.console です
ターゲットフレームワークが console になってるのもかもしれません
スタンドアロンのインストールですし コマンドライン専用ツールの可能性もあります
一応 SDK には dll があるので動的なロードでフルパスで指定してみましたがそれでもエラーでした
このツールは OS も問わないものみたいですし Windows 固有の WinForms などは対応してないのかもですね

インストール方法には .NET アプリに埋め込むタイプもあるようですし WinForms や WPF アプリに IronPython を埋め込めば GUI も使えるのかもです
VS2019 だと .NET6 が動かない?
.NET5 が出た頃 LTS じゃないし LTS の 6 出たら使おうと思ってたけど使ってなかった
そういえば .NET6 はもう出てたっけと思って使ってみようとしたけど どうすれば使えるの?
Visual Studio のアップデートで最新にしたけど選択肢に出てこない
標準では付属してないの?
SDK を Visual Studio 外でダウンロードしてインストールすれば良い?

調べてみると VisualStudio 2019 だと .NET6 はサポートしてないみたい
Visual Studio 2022 が必要みたい
一応 2019 でも手動で設定ファイルを変更することで .NET6 を扱えるようだけど完全な機能はつかえないらしい
あと GUI での選択肢でちゃんと表示されず直接設定ファイルを扱わざるを得なくなるとか

2019 から 2022 はアップデートじゃなくて別物のインストールになるからあまりやりたくないんだけど
容量的にも動作的にも重くなるし
2015,2017,2019,2022 って種類多いし アップデート対応してほしい

実際調べてたときに 2019 でも使えるようにして欲しいって声はよく見かけた
だけど結局 2022 以降のままみたい
今だともう 2022 が正式リリースされてるけど .NET6 が出た頃はまだ Visual Studio 2022 はプレビュー版のみだったらしく フレームワークの LTS が出てるのにそれを使うツールがプレビュー版しかないっていうおかしな状態だったみたい
今でもまだ 2022 が出てそれほど経ってないから 2019 のほうが安定していて 2019 で動かしたい人は多そう

特に企業だと無料の Community エディションじゃなくて有料エディションが必要だから 2022 への移行は時間がかかりそうだし 新しいバージョンが出るたびに買ってくれないことも多そう
今でも 2010 や 2015 みたいな結構前のバージョン使い続けてるって話をたまに見かけるし

完全対応してないのをムリに使うことはしないとすれば 2019 は .NET5 まで
.NET5 は LTS じゃないしサポート終了は今年の 5 月でもう 50 日もない
.NET Core 3.1 は LTS で 2019 でも使えるけど今年の 12 月まで
今から新しく作ったり .NET Framework で作ったものを移植する先にはならなそう
https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core

それだと昔ながらの .NET Framework しか候補にならない
Visual Studio 2019 は .NET Framework 用で .NET にするなら Visual Studio 2022 以降という扱いなのかも
.NET Framework はもう更新されないと言われてたけど ARM 対応で 4.8.1 を出す(もう出てる?)という話もあるし やっぱりなんだかんだ更新される気もする
Windows 11 を出さないと言ってたのに出すのが Microsoft なんだから
実際 Visual Studio 2019 のままで .NET Framework を使い続ける企業が多くて .NET6 への移行が進まずやっぱり方針変えますとか言ったりもしそう

.NET Framework のままでも C# の新機能が使えるなら別にいいと言えばいい
Linux で動かすつもりないし
調べてみると .NET Framework でも使える機能は多いらしいけど 追加の設定やパッケージの導入が必要になって 意識しなくてもいいってレベルではなさそう
1, 2 年もすれば更に色々変わって便利になってるかもしれないし .NET6 関係はもうしばらく放置でいいかな

最近だと React Native や Flutter といったクロスプラットフォーム開発フレームワークが Windows でも使えるようだし この辺使ってみるのもありかなと思ってる



以上の内容はhttps://let.blog.jp/tag/.NETより取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14