.NET Frameworkの周辺(3)
.NET Frameworkをめぐるその他の話題
《 初回公開:2019/10/05 , 最終更新:2020/05/14 》
【 目次 】
.NET Frameworkのツール
NGen.exe - マネージコードの実行が遅いと感じた時には
NGen.exeというツールを使うとアセンブリのILコードをすべてネイティブコードに変換してディスク上のファイルに保存する事ができる。
これにより、実行時にアセンブリがロードされるとCLRはこのコンパイル済みのコードを自動的に探して実行するため、JITコンパイラによるコンパイルの処理時間を省略でき実行時間を高速化できる。
- 猫の気ままなC#日記
-
.NET Frameworkのngen.exe - 続・日々の雑感
C:\Windows\Microsoft.NET\Framework\v4.0.30319\ngen.exe install C:\Users\WK6\Hoge.exe
プログラムを移動する、あるいは上書きすると効果が無くなってしまうため注意。 - .NET Framework のネイティブ イメージが無効になる状況と考えられる影響について ? Visual Studio サポート チーム blog
C#やVBを逆コンパイル
ILSpy
以下よりILSpy_binaries_5.0.2.5153.zipをダウンロードし適当なフォルダーに解凍。
ILSpy.exeを起動して.netアプリのexeファイトをドラッグ&ドロップ
画面上のツールバーより検索アイコンをクリック、メソッドやクラスの検索なんかが便利かな。
いきなりILのコードをみてもさっぱりわやですはなんで、これもツールバーの検索アイコンの左にあるリストボックスより「IL with C#」を選択。
GAC(グローバル・アセンブリ・キャッシュ)に格納されているアセンブリを開くにはFileメニューより「Open From GAC」を選択。
VisualStudioでILSpy
VisualStudioの拡張機能のILSpyプラグインを利用する事ができる。
インストールは
VisualStudioのメニューバーの拡張機能->拡張機能の管理を選択。 拡張機能の管理画面より左ペインのオンラインを選択し右上の検索ボックスに「ILSpy」と入力 検索結果にILSpyが表示されたらダウンロードボタンを押下。
VisualStudioからILSpyを起動するにはソースエディタ上でマウスを右クリックして表示されるメニューより「Open code in ILSpy」を選択。 「Open code in ILSpy」はソリューションエクスプローラーでプロジェクトを選択して右クリックしても表示できる。 メニューバーのツールメニューから「ILSpy」を選択する事でも起動できる。
単体で起動するには
どこにインストールされたんだろう? タスクマネージャを使って調べてみると、 私の環境では
C:\Users\<ユ-ザ名>\AppData\Local\Microsoft\VisualStudio\16.0_09e8b3e7\Extensions\5laj5qzn.x5i
dnSpy
デバッグもできる逆コンパイラ
以下よりdnSpy-net472.zipをダウンロードし適当なフォルダーに解凍。
64bit アプリをデバッグする際は dnSpy.exe を、32bit アプリをデバッグする際は dnSpy-x86.exeを起動して実行。
- .NET のデコンパイル、デバッグ、ソースの編集も可能なオープンソースのツール dnSpy
- 凄すぎて大草原不可避な.NET デコンパイラdnSpyを使ってみる - Qiita
- IL DnSpyが神ツールだった件 - はかせのラボ
VisualStudioと連携するためのはGoToDnSpy拡張機能をインストール
VisualStudioのメニューバーの拡張機能->拡張機能の管理を選択。 拡張機能の管理画面より左ペインのオンラインを選択し右上の検索ボックスに「ILSpy」と入力 検索結果にILSpyが表示されたらダウンロードボタンを押下。
ツールメニュー->オプションよりGoToDnSpyを選択、dnSpyのパスを指定する。 VisualStudioからの起動はソースエディタよりコード(メソッド、イベントなど)にカーソルを置き、「GoTo dnSpy ...」コマンドを実行で起動するはずなんだけど時々起動しない事が。
dotPeek - C#やVB.NETアプリのデコンパイル
-
dotPeekは無料の.NETデコンパイラとアセンブリブラウザです。
dotPeekの背後にある主なアイデアは、.NETコミュニティ内の誰もが高品質のデコンパイルを無料で利用できるようにすることです。 - .NetデコンパイルツールdotPeekを試してみる - Qiita
- 【C#】.NET アセンブリを逆コンパイルできる「dotPeek」紹介 - コガネブログ
- dotPeekの正式版が出たらしいので入れてみた。 | かるあのメモ on WordPress
-
exe からソースコードへ逆コンパイル (デコンパイル) 、解析、デコード(Decode) リバースエンジニアリングのやり方 | urashita.com 浦下.com (ウラシタドットコム)
JustDecompile
SharpLab
Web上でC#
ILをアセンブル
ILコードをilasm.exeでアセンブル(機械語に変換)
ildasmツールで逆アセンブル
ILツール
Ilasm
Ildasm
Fuslogvw.exe - アセンブリ バインドに関する情報を表示
ILの命令
ILにまでさかのぼってコードを追えれば良いのだけど理解できていない。 せめて、参考になりそうなサイトをググってみた。
MSIL 命令一覧
ECMA-335の仕様書
javaとの比較 そして LLVM
C#はJavaとよく似ていると言われる。
Java バイトコード 仮想マシン
.NET Framework cil バイトコード java
- C#とは?
こうして Microsoft は(おそらく)Javaの2番煎じと呼ばれる覚悟で .NET 構想を提唱しました
事実、CLR は Java VM、MSIL は Java バイトコード、C# は Javaという技術に酷似しています - C#入門/C#とは? - WisdomSoft
実際、以下のJavaに関する記事を読んでみると、.NET FrameworkはJavaのバイトコード,仮想マシンと同じ発想に思える。
Java仮想マシン
Javaバイトコード
MSILとJavaバイトコード
LLVM
仮想マシンの発想は他にもあって、
C# と java
- C SharpとJavaの比較 - Wikipedia
- Javaと似てるC#の使い方。Javaとの違いは何? | kuguru[クグル]
しかし、C#とJavaでは設計思想が大きく異なり、Javaでは安全性・複雑さの回避などの観点から廃止された機能が、C#では実行効率を重視するために残されていたりします。
加えてC#ではコードの冗長化を避けるために、Javaには存在した機能を減らし、逆に新たに追加された機能も多いです。
したがって、C#とJavaはよく似た言語ではありますが、内実全く異なる言語であると言えるでしょう。
標準化
java 標準化 オープン オラクル C#
以外な事にC#はJavaよりもオープンでは
- C SharpとJavaの比較 - Wikipedia
C#はEcmaとISO、JISによって定義されている。標準化の対象は言語構文、基本クラスライブラリ、アセンブリ形式、実行環境(共通言語基盤: CLI)など多岐に渡る。
下位層フレームワークの上に新しく実装された上位層ライブラリの多くはこの標準には含まれない(Windows Forms、ASP.NET、ADO.NETなど)。
現在のところ、Javaのどの部分も第三者の標準化団体によって標準化されていない。
Javaの商標、ソースコードやその他の素材に関してはオラクル(旧サン・マイクロシステムズ)が無制限の独占的な権利を保持しているが、オラクル(サン)はJava Community Process[10] (JCP) と呼ばれるプロセスに参加し、当事者たちがJavaに関連する技術(言語、SDKからAPIに至るまで)に対する変更を専門家団体や諮問会議を通して提案することを許可している。
JCP内の規定では、Javaに対する新しい仕様や変更はオラクル(サン)による承認が必要であるとされている。
JCPは営利寄与者に対しては会費が必要としているが、非営利寄与者や個人は無料で参加できる。 - Javaの現状整理と今後についての考察 - Qiita
- Google対OracleのJava API訴訟。歴史的経緯とIT業界への影響を考える(その2)。JJUGナイトセミナー - Publickey
.NET Framework と ECMA
C#とECMA
C#はECMAを通じて公開されている。
- C Sharp - Wikipedia
C#の言語仕様は標準化団体Ecma Internationalを通じて公開・標準化されており、第三者がマイクロソフトとは無関係にコンパイラや実行環境を実装することができる。
- ECMA C#および共通言語インフラストラクチャ標準
- プログラミング言語「C#」がJISに制定
ECMA
- ECMAとは - はてなキーワード
情報技術の標準化をおこなっている国際的団体.ECMAScript,C#,光ディスクなどの仕様が策定されている.
- Ecmaインターナショナル - Wikipedia
情報通信システムの分野における国際的な標準化団体。
ECMAScript
C#とは関係ないが、ECMAはJavaScriptの標準化も進めている。
.NET FrameworkとGUI
.NET FrameworkにはGUIのフレームワークがいろいろあって
WPF WinForms Windows UI UWPアプリ
- C# - 新規開発ソフトのWindowsForms、WPF、UWPの選択について|teratail
- [Microsoft] Windowsデスクトップ向け業務アプリ開発には何を採用すべきか? - Qiita
- Windows Forms から移行するべきプラットフォームは? - Qiita
WinForms
- Windows Forms - Wikipedia
Windows FormsはWindows API(GDI/GDI+)をマネージコードでラップし、Windowsのユーザーインターフェイス要素へのアクセスを提供するフレームワークである。
従来からVisual C++用に提供されていた、複雑なネイティブC++ベースのMFCや、旧Visual Basic(VB6)のフォームにとって代わるものとされる一方で、Windows FormsはMVCモデルを提供していない。
UWPアプリ
UWPアプリとは?
- ユニバーサルWindowsプラットフォーム - Wikipedia
ユニバーサルWindowsプラットフォーム(Universal Windows Platform:ユニバーサル ウィンドウズ プラットフォーム、略称:UWP)とは、異なるデバイス向けに提供されるMicrosoft Windows用のアプリケーションソフトウェアを共通の基盤上で動作させることのできる、統合されたプラットフォームのことである。
...
ユニバーサルWindowsプラットフォームは、Windows 10にて導入された、様々なデバイス上で動作するアプリケーションを単一のフレームワーク上に統合する仕組みである。
ターゲットデバイスを設定することで、すべてのデバイスで共通となる基本APIセットに対してデバイス固有のAPIセットを付加する形で、デバイス固有の機能を使ったUWPアプリを開発することができる[1]。 - UWP(ユニバーサルWindowsプラットフォーム)とは? UWPアプリ開発の特徴 - Build Insider
WPF Silverlight XAML
- Windows Presentation Foundation - Wikipedia
Windows Presentation Foundation (WPF) はマイクロソフトが開発した、.NET Framework 3.0以降に含まれるユーザインタフェースサブシステムである。開発時のコードネームはAvalonであった[1] [2]。
...
WPFは、ユーザインタフェースとロジックを明確に区別する一貫したプログラミングモデルを提供する。
WPFアプリケーションはデスクトップで実行するだけでなくウェブブラウザ上で配置・実行することもできる(ただし類似技術のSilverlightとは違い、Windowsのみがターゲット環境となる)。
...
WPFのUIはXAMLと呼ばれるXMLベースのマークアップ言語で記述され、対応するイベントハンドラなどをC#あるいはVB.NETなどの.NET系言語で記述することになる(コードビハインド(英語版))。これはWPFの強力な利点のひとつであり、ロジックとインターフェイスを完全に切り離すことができる。
...
Windows 8/Windows RTにおいて導入されたWindowsストアアプリ(WinRTアプリ、Modern UIアプリケーション)はWPF同様XAMLによってユーザインタフェース要素を記述し、WPFに類似したプログラミングモデルを提供する。Windows 10においてWindowsストアアプリの後継として導入された、ユニバーサルWindowsプラットフォーム (Universal Windows Platform, UWP) アプリケーションも基本は同様である。 - 第1回 WPFとSilverlightをまとめて習得しよう (1/4):連載 WPF/Silverlight UIフレームワーク入門 - @IT
- WPF 対 Silverlight: プロジェクトに最適な技術を選ぶ
Silverlightは、元々WPF/E (E は Everywhereからきている)で、ブラウザで走るwebアプリケーションを対象にしたWPFのサブセットである
XAML
- Extensible Application Markup Language - Wikipedia
Extensible Application Markup Language(XAML、ザムルと発音する[1])は、オブジェクトやプロパティ、あるいはそれらの関係や相互作用を定義するために用いられるXMLベースの宣言的言語である。
XAMLという略語はもともと「Extensible Avalon Markup Language」に由来していた。AvalonとはWindows Presentation Foundation (WPF) のコードネームである。
...
XAMLは.NET Framework 3.0以降のテクノロジーにおいて広範囲にわたって使われている。とりわけ、Windows Presentation Foundation (WPF) および Silverlightにおいてユーザーインターフェイス要素やデータバインディング、イベント処理、などを定義するために、また、Windows Workflow Foundation (WF) においてワークフローそのものを定義するために用いられる。
なお、Windows 8およびWindows RTで利用できるWinRT APIを使用したWindowsストアアプリでは、.NETアプリケーションに限らずC++ネイティブアプリケーション[2]でもXAMLを使ってUIを構築することが可能となっている。後発のWindows 10にて対応したユニバーサルWindowsプラットフォーム (UWP) アプリもまたWinRTベースであり、XAMLを利用して開発する。
クロスプラットフォームな.NETアプリケーション開発に利用可能なXamarin.Formsでは、UIの記述にXAMLを用いる。
WPF/SilverlightとMVVMアーキテクチャ
- Model View ViewModel - Wikipedia
- Webアプリケーション開発者から見た、MVCとMVP、そしてMVVMの違い - Qiita
- MVVMを勉強するときに参考になったリンク集 & 概要まとめ - Qiita
- 開発者が知っておくべき、6つのUIアーキテクチャ・パターン - @IT
Martin Fowler氏ってどんな人
Windows UI Library
- Microsoft、「Windows UI Library」を公開 ~OSバージョンに縛られずに新機能を導入可能 - 窓の杜
-
MS、Windows UXの主要フレームワークをオープンソース化--Visual Studio 2019プレビューも公開 - ZDNet Japan
「Windows」フレームワークの「Windows Presentation Foundation」(WPF)と「Windows Forms」(WinForms)、「Windows UI XAML Library」(WinUI)をオープンソースライセンスの下で利用可能にしたと発表した。
...
Microsoftは2018年の「Build」カンファレンスでアナウンスした通り、WPF、WinForms、XAML Islands(WinFormsとWPFアプリなどでUniversal Windows Platformのコントロールを利用する仕組み)を使ってクライアントアプリを構築するためのサポートを「.NET Core 3.0」に追加している。 -
変わるWindowsのアプリ戦略 UWPからデスクトップアプリに原点回帰か ( Windows ) - etTomioのネットニュース斜め読み - Yahoo!ブログ
ドメインモデル
ちょっとわき道にそれて、MVCパターンででてくるドメインとは
レイヤアーキテクチャ、さらにドメイン層 とは
- レイヤ化アーキテクチャ - Qiita
システムそのものであるロジックを置くレイヤです。ビジネスロジックとも呼ばれます。
- レイヤーアーキテクチャを理解してみる | しびら
- 多層アーキテクチャ - Wikipedia
結局、とりあえずはWinFormsの方が作りやすいのでWinFormsでいいかな。
他のUI(WPF,UWP)の方が優れている点もあるのだけれど、普及していない事には無駄な資源を使う事はためらわれる。
流行に流されずいつかメジャーなUIが確立しそうになった時点で乗り換えた方が得かな
いっその事、.NETよりもマルチプラットフォーム開発を目指してNode.js+ElectronかReact Native
NET Core そして .NET Standard , Mono と Xamarin
net framework .net core
Visual Studio IDEを久しぶりに使っていたらNET Coreなるものが
- .NET Core - Wikipedia
.NET Coreは、ASP.NET Coreウェブアプリ、コマンドラインアプリ、ライブラリ、ユニバーサルWindowsプラットフォームアプリ(英語版)といった、4つのクロスプラットフォームシナリオをサポートする。現時点の.NET Coreには、Windowsのデスクトップソフトウェア用の標準GUIを提供するための、Windows FormsとWPFは実装されていない[7][10]。
2018年にマイクロソフトは、デスクトップ技術であるWindows Forms、WPF、UWPを.NET Core 3からサポートすることを公表した[11]。 - .NET Core について | Microsoft Docs
.netのクロスプラットフォームは
- Monoプロジェクト
- Xamarin
- .NET Core
といろいろあって混乱
- .NET Coreとは? 開発環境(SDKとVisual Studio Code)のインストール - Build Insider
- ASCII.jp:.NET Core / .NET Framework / Xamarin / Monoの関係を整理する (1/3)
- .NETの派生を理解する
今後、.NET5によって統合されるのかな?
- 「.NET Core 3.0」の後継は「.NET 5」 ~2020年11月にリリースへ - 窓の杜
-
.NET Core その63 - .NET Coreの将来と.NET 5・.NET Frameworkから.NET Coreへ - kledgeb
また今後将来的に「.NET」に対して行われる投資は、以下のものを含みすべて「.NET Core」 に注がれます。
-
Runtime
- JIT
- AOT
- GC
- BCL (Base Class Library)
- C#
- VB.NET
- F#
- ASP.NET
- Entity Framework
- ML.NET
- WinForms
- WPF
- Xamarin
Monoプロジェクト
Xamarin(ザマリン)
.NET Standard
.NET Standardという.NETのAPIが規定されていてこのAPIのみを使う事でクロスプラットフォームが保証されるという事なのかなと勝手に思っているのだけれど
NET Core コンソール アプリケーション
- Visual Studio 2017 での .NET Core を使用した C# Hello World アプリケーションの構築 - .NET Core | Microsoft Docs
- CLI を使用する .NET Core に関する概要 - .NET Core | Microsoft Docs
NET Core コンソール アプリケーション 実行方法
Visual Studio2019でNET Core コンソール アプリケーションをビルドしたらexeではなくdllファイルが生成されてしまった。
このdllファイルはコマンドプロンプトからどうやって実行するのだろう?
dllの存在するデレクトリに移動して
dotnet xxx.dll
まるでjava.exeとjarファイルの関係を連想させる。
.NET Native
.NET Native
.NET Coreの--native オプション
-
.NET 2015とは何か (2/3):特集:.NET大変革 - @IT
一般に、.NETアプリは中間言語(MSIL)へとコンパイルされ、これが実行時にJITコンパイラーによってネイティブコードへと変換される。これを事前にネイティブコードへとコンパイルしておく仕組みが.NET Nativeだ。
-
C#と.NET Frameworkを使ってプログラミングが可能
- ネイティブコードならではのパフォーマンスを得られる
- ネイティブコードになった後でも.NET Frameworkが持つガベージコレクションなどの機能の恩恵を受けられる
- アプリ起動時間の短縮
-
アプリを実行するマシンでは.NET Frameworkが不要
-
.NET ネイティブによるアプリのコンパイル | Microsoft Docs
通常、.NET Framework を対象とするアプリは中間言語 (IL) にコンパイルされます。 実行時に、Just-In-Time (JIT) コンパイラによって IL がネイティブ コードに変換されます。 これに対し、.NET ネイティブは、Windows アプリを直接ネイティブコードにコンパイルします。 開発者にとって、これは次のことを意味します。
-
アプリは、ネイティブコードのパフォーマンスを特徴としています。
通常、パフォーマンスは、最初に IL にコンパイルされてから JIT コンパイラによってネイティブコードにコンパイルされるコードよりも優れています。 - 引き続き C# または Visual Basic でプログラムを作成できます。
-
クラス ライブラリ、自動メモリ管理とガベージ コレクション、例外処理など、.NET Framework で提供されるリソースを引き続き利用できます。
-
アプリのユーザーのために、.NET ネイティブには次のような利点があります。
-
大部分のアプリとシナリオの実行時間が短縮されます。
- ほとんどのアプリとシナリオで、起動時間が短縮されます。
- デプロイコストと更新コストが低くなります。
- アプリのメモリ使用量が最適化されています。
重要 アプリとシナリオの大部分では、IL または NGEN イメージにコンパイルされたアプリと比較した場合、起動時間が大幅に短縮され、パフォーマンスが向上します。
JITコンパイラに対してAOTコンパイラによって最初からネイティブコードを出力して実行の高速化をはかる。
プロジェクト ファイル,ソリューション ファイルの存在するデレクトリに移動して
dotnet publish -c Release -r win-x64 --self-contained true
Roslyn(ロズリン)
Roslynは.NETのコンパイラの事らしいが、
ただのコンパイラではなくAPIを使ってプログラムからコンパイラの各要素(構文解析など)の機能を呼び出して利用する事ができるらしい。
- Visual Studio 2015の新機能“Roslyn”とは - Build Insider
- 10分間で人に説明できるまで分かるCompiler as a Service“Roslyn” - Build Insider
ML.NET
ML.NET
機械学習(ML)も.NETで
- マイクロソフト、.NET向け機械学習プラットフォーム「ML.NET 1.0」のリリース発表 - ZDNet Japan
ML.NETでは、.NET開発者に対してPythonを学習するよう求めるのではなく、C#言語という、Microsoftのメインストリームでよりなじみある環境でのML作業を可能にしている。
- ML.NET のドキュメント - チュートリアル、API リファレンス | Microsoft Docs