.NET Frameworkの周辺(3)

.NET Frameworkをめぐるその他の話題

《 初回公開:2019/10/05 , 最終更新:2020/05/14 》

【 目次 】

.NET Frameworkのツール

NGen.exe - マネージコードの実行が遅いと感じた時には

NGen.exeというツールを使うとアセンブリのILコードをすべてネイティブコードに変換してディスク上のファイルに保存する事ができる。
これにより、実行時にアセンブリがロードされるとCLRはこのコンパイル済みのコードを自動的に探して実行するため、JITコンパイラによるコンパイルの処理時間を省略でき実行時間を高速化できる。

C#やVBを逆コンパイル

ILSpy

以下よりILSpy_binaries_5.0.2.5153.zipをダウンロードし適当なフォルダーに解凍。

ILSpy.exeを起動して.netアプリのexeファイトをドラッグ&ドロップ

画面上のツールバーより検索アイコンをクリック、メソッドやクラスの検索なんかが便利かな。

ILSpyの検索アイコン

いきなりILのコードをみてもさっぱりわやですはなんで、これもツールバーの検索アイコンの左にあるリストボックスより「IL with C#」を選択。

GAC(グローバル・アセンブリ・キャッシュ)に格納されているアセンブリを開くにはFileメニューより「Open From GAC」を選択。

VisualStudioでILSpy

VisualStudioの拡張機能のILSpyプラグインを利用する事ができる。

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を起動して実行。

VisualStudioと連携するためのはGoToDnSpy拡張機能をインストール

VisualStudioのメニューバーの拡張機能->拡張機能の管理を選択。 拡張機能の管理画面より左ペインのオンラインを選択し右上の検索ボックスに「ILSpy」と入力 検索結果にILSpyが表示されたらダウンロードボタンを押下。

ツールメニュー->オプションよりGoToDnSpyを選択、dnSpyのパスを指定する。 VisualStudioからの起動はソースエディタよりコード(メソッド、イベントなど)にカーソルを置き、「GoTo dnSpy ...」コマンドを実行で起動するはずなんだけど時々起動しない事が。

dotPeek - C#やVB.NETアプリのデコンパイル

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を通じて公開されている。

ECMA

ECMAScript

C#とは関係ないが、ECMAはJavaScriptの標準化も進めている。

.NET FrameworkとGUI

.NET FrameworkにはGUIのフレームワークがいろいろあって

WPF WinForms Windows UI UWPアプリ

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アーキテクチャ

Martin Fowler氏ってどんな人

Windows UI Library

ドメインモデル

ちょっとわき道にそれて、MVCパターンででてくるドメインとは

レイヤアーキテクチャ、さらにドメイン層 とは


結局、とりあえずは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

といろいろあって混乱

今後、.NET5によって統合されるのかな?

Monoプロジェクト

Xamarin(ザマリン)

.NET Standard

.NET Standardという.NETのAPIが規定されていてこのAPIのみを使う事でクロスプラットフォームが保証されるという事なのかなと勝手に思っているのだけれど

NET Core コンソール アプリケーション

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 Native とコンパイル | Microsoft Docs

  • .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を使ってプログラムからコンパイラの各要素(構文解析など)の機能を呼び出して利用する事ができるらしい。

ML.NET

ML.NET
機械学習(ML)も.NETで

ページのトップへ戻る