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


.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 の方にチェック
WinForms でウィンドウが勝手に裏側に移動する
これと関連して WinForms の地味に不便な謎挙動

◯ Form を 4 つ用意
◯ Form1 が最初に開くメインフォーム
◯ Form1 にボタンを配置してクリックすると new Form2().Show();
◯ Form2 にもボタンを配置してクリックすると new Form3().ShowDialog();
◯ Form3 は Load イベントで Form4 を開いて即閉じる

var form = new Form4();
form.Show();
form.Close();

◯ Form4 は機能なし

● 実行したらボタンを押して Form3 まで開く
● Form2 まで閉じると Form1 が見えなくなってる
● Form1 は他のウィンドウより裏側にいる (デバッグ実行中なら VS のウィンドウよりも後ろ)

Form3 では Load の代わりにボタン操作でやると再現しなかった
ウィンドウはなんでもよくて Chrome とかエクスプローラがあればその後ろに行く


この再現方法だと発生しないが これのようにウィンドウが裏側にいく場合に 裏側に行ったウィンドウをアクティブにしても IME が有効にできないケースもあった
これみたいにエクセルなどの別プログラムが原因ではなさそう
他のエクセルなどを閉じても発生してる
調べるの面倒だし 今のところはこれは調べる予定なし → 調べた
WinForms アプリで IME が効かなくなることがある (続き)
前回

発生する PC だと使ってないけど Excel を開きっぱなしで 昔から Excel 2013 以降は他のソフトの挙動が怪しくなることが時々あったので もしかして? と思って閉じてから再実行したら発生しなくなった

他も色々試すと PDF Viewer も開いてる状態では IME に影響してた
開いてるだけで別アプリの IME まで影響するのはやめてほしいなぁ
WinForms アプリで IME が効かなくなることがある
IME がおかしくなることはときどきあるけど 以前自分で作ったものでも確実に再現するのがあったので気になったから調べてみた
一見するとおかしくなりそうなところはないので 再現するのを確認しながら色々機能を消していって ライブラリ依存はなくなって WinForms だけで発生するのを確認

どういう処理にしたら発生するかを覚えれる程度まで削ったので別 PC で 1 から同じものを作ったらなぜか再現しない
見比べても違いがわからないのでフォルダごとコピーして完全に同じソースで実行しても再現しない
ビルドした exe ファイルを持ってきても何故か発生しない
環境はどっちも Windows10 1909

再現するのに不要な部分を削る過程で 序盤は削ったら再現しなくなってたのに後半は削っても再現してたとか謎な部分もあったし確実に再現するものじゃないのかも?
だけど完全なアプリの形だと他 PC でも発生してる

一応やり方

◯ Form を 3 つと UserControl を 1 つ用意
◯ Form1 が最初に開くフォーム
◯ Form1 には TextBox と Button を配置
    ◯ Button をクリックで Form2 を開く
◯ Form2 の Load イベント時に:
    ◯ UserControl1 のインスタンスを this.Controls.Add で追加
    ◯ Form3 を開いて即閉じる
◯ Form2 の FormClosing イベント時に:
    ◯ UserControl1 を this.Controls.Remove で除外
    ◯ ↑で除外した UserControl1 の Dispose メソッド呼び出し
◯ UserControl1 は押しても反応ないボタンを一つだけ配置
◯ Form3 は機能一切なし

● 実行してテキストボックス上で IME が切り替えれることを確認
● ボタンを押して Form2 を開いたら何もせずに閉じる
● テキストボックスで IME が切り替えられなくなってる

Form2 で変なことしてるのはライブラリがやってた挙動をそのまま持ってきて再現するところだけ残したから
Dispose や Remove しなかったり Form3 を開かなかったり UserControl1 のボタンを消したりすると再現しなくなる

バージョンは .NET Framework で 3.5 や 4 や 4.6.1 など
IME はデフォルトのでも Google IME でもどっちでも

続き
ildasm
dll ファイル調べたら やっぱり C++ で作ったものと .NET でつくったものは全く別ものみたい
同じ拡張子だから 同じように外部から使えるフォーマットかとちょっと期待したけど無理みたい
C++ で作った dll の中身を見るツールに C# で作ったものを入れても何も見れない状態でした

C# で作ったものの中身を見たいと思って調べたら ildasm というツールがあるみたい

コマンドラインツールのようですがダブルクリックで開くとウィンドウが出て GUI で使えました
dll を入れるとクラスやそのメソッドやプロパティなどを表示できます
さらに中間言語での処理を見ることもできました

C++ で作った dll を見るツールとは違いできることが多いです

また JetBrains の dotPeek というツールもあってこっちだと C# のコードまで見れました
本来のソースコードが入ってるわけではないので完全ではないですが 問題なく読める部分が多かったです
IL って思った以上に多くの情報を持ってるのですね

ところで ildasm は .NET Framework 専用で .NET Core にはついてきませんでした
ildasm は .NET Framework の SDK についてくるので VisualStudio を入れてると一緒に入ってるかと思います
場所はこのへん

C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.7.1 Tools

v10.0A は Windows のバージョンで 7.0A や v8.1A などもあります
NETFX の後の数字は .NET Framework のバージョンです

一応 .NET Core でも非公式なものでパッケージをインストールすることで使えるものはありました
試してないのでクオリティは不明です
.NET に新しそうな JSON ツールが増えてた
.NET って標準じゃ JSON が扱いづらすぎて JSON.NET とか DynamicJSON とか外部のライブラリ使うのが一般的と言ってもいいくらい
ただこれらも万能ってわけじゃなくて .NET は JSON 弱いって印象だったけど 公式パッケージで新しい JSON の機能が出てたみたい

https://www.nuget.org/packages/System.Text.Json

.NET Core 3.0 はだと標準機能みたい

https://docs.microsoft.com/ja-jp/dotnet/api/system.text.json?view=netcore-3.0

今度 C# 使うときに使ってみる
UWP のデバッグ実行ができない
UWP 使ってみようとインストールしたのに新規プロジェクト作ってそのままデバッグ実行したら

「App のライセンス認証が失敗しました。エラー コード: アプリは開始されませんでした。。ライセンス認証フェーズ: COM ActivateExtension」

って言われた
テンプレートのままの新規プロジェクトすら動かないって……
いきなりやる気を削がれたので UWP はまたいつか
.NET Framework 関係のファイルの場所
msbuild
C:\Windows\Microsoft.NET\Framework\v2.0.50727\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v3.5\MSBuild.exe
C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v2.0.50727\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v3.5\MSBuild.exe
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe
C:\Program Files (x86)\MSBuild\14.0\Bin\MSBuild.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\MSBuild.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\MSBuild\15.0\Bin\MSBuild.exe

コマンドラインからビルドするツール

14.0 は VisualStudio 2015
15.0 は VisualStudio 2017
Community と WDExpress は VS のエディションの違い


framework
C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\
C:\Program Files\Reference Assemblies\Microsoft\Framework\
C:\Windows\Microsoft.NET\Framework\
C:\Windows\Microsoft.NET\Framework64\

.NETFramework の dll


gac
C:\Windows\assembly\
C:\Windows\Microsoft.NET\assembly

グローバルアセンブリキャッシュ
4.0 以降が Microsoft.NET の方


csi
C:\Program Files (x86)\MSBuild\14.0\Bin\csi.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\WDExpress\MSBuild\15.0\Bin\Roslyn\csi.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\MSBuild\15.0\Bin\Roslyn\csi.exe

C# の REPL ツール


fsi
C:\Program Files (x86)\Microsoft SDKs\F#\4.1\Framework\v4.0\fsi.exe
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\CommonExtensions\Microsoft\FSharp\fsi.exe

F# の REPL ツール
Python で WPF 作れるらしい
WPF のコードで調べ物してたら Python で書いてるコードをみつけた
.NET Framework 上で動く Python 実装の IronPython というのを使えばできるらしい
.NET 上の Python は聞いたことあったけど WPF や WinForms も普通に使えるのは驚き
そういえば VisualStudio で Python 使えるようになってたし最近は流行りの言語でもあるから マイクロソフトが力入れて作ってたり?

さっそく使ってみようとしたけど最新版は 2.7 互換の IronPython 2.7
3 じゃない!
私 Python 3 しかわからないです
ということで 3 はないのか調べてみるとリポジトリを発見
https://github.com/IronLanguages/ironpython3

だけど思ったより規模が小さそう
最近のコミットはあるし 放置されてるプロジェクトではないけど活発とは言えないと思う
Build は failing だし tag もないあたり 1.0 的な部分にも達してないベータ版な気がする
ビルド済みの配布もなくて 使うなら自分で make してって状態

調べてみたら もともとはマイクロソフトじゃない人が初めて マイクロソフトもプロジェクトに参加してたけど 今ではやめてプロジェクトが停滞気味みたいな話がでてきた


使ってみるのは正式リリースしたらでいいかな
また今度覚えてれば使ってみる
.NET Framework のサポート期限
https://support.microsoft.com/ja-jp/lifecycle/search?sort=PN&alpha=.NET%20Framework&Filter=FilterNO
https://support.microsoft.com/ja-jp/help/17455/lifecycle-faq-net-framework

ここ参照

○ 3.5 まで

3.5 の SP1 以外は終了済み
3.5 の SP1 は未だにサポートされてる
OS のサポート期間中はサポートされる
(7 のサポートが終わったら 7 では .NETFramwork もサポート切れる?)

一部機能 (dynamic 型とかメソッド色々) が使えなかったり 使えてもこういう違いがあるのであえて選ぶ必要はない

○ 4.0 から

4.0, 4.5, 4.5.1 はサポート終了済み
4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1 がサポートされてる

これらも OS と同じライフサイクルでサポートされる

○ ダウンロード

https://www.microsoft.com/net/download/visual-studio-sdks

VS の EditContinue
ちょっと古めの Framework バージョンで C# 動かしていたときのこと

アプリケーションのデバッグ中というのに気付かず ソース書き換えようとしたら

エディットコンテニュー ができるのは 4.5.1 からです

というメッセージが


Chrome のデバッガみたいに実行中にソースが書き換えれるのかな?
Roslyn のスクリプト機能付いた頃のバージョンぽいし そういうことできそう


だけど普段実行中に書き換えようとしたら「実行中です」みたいな警告ダイアログが出てた気もする




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

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