InteroperabilityEdit
コンピュータ システムでは、一般的に新しいアプリケーションと古いアプリケーションの間で相互作用が必要になるため、.NET Framework では、.NET 環境の外で実行される新しいプログラムと古いプログラムで実装された機能にアクセスする手段を提供しています。 Component Object Model (COM) コンポーネントへのアクセスは、フレームワークの System.Runtime.InteropServices
System.EnterpriseServices
名前空間で提供されています。 その他の機能へのアクセスは、Platform Invocation Services(P/Invoke)を介して行われます。
言語の独立性
.NET Frameworkでは、CLRでサポートされているすべての可能なデータ型とプログラミング構造、およびそれらがCLI仕様に準拠してどのように相互作用するかしないかを定義する共通型システム(CTS)を導入しています。 この機能により、.NET Framework は、適合する .NET 言語を使用して記述されたライブラリやアプリケーション間で、型やオブジェクト インスタンスの交換をサポートします。
型の安全性
CTS と .NET Framework で使用される CLR は、型の安全性も強制します。 これにより、オブジェクトにアクセスする際に、定義されていないキャスト、間違ったメソッドの呼び出し、およびメモリ サイズの問題を防ぐことができます。 また、これにより、ほとんどのCLI言語は(型推論の有無にかかわらず)静的に型付けされています。
PortabilityEdit
Microsoft は Microsoft Windows 以外のシステムに完全なフレームワークを実装したことはありませんが、フレームワークはクロスプラットフォームであるように設計されており、他のオペレーティングシステム用の実装が利用可能です(Silverlight および § Alternative implementations を参照)。 マイクロソフトは、CLI(コア・クラス・ライブラリ、CTS、CILを含む)、C#、C++/CLIの仕様を、ECMA(Ecma International)とISO(International Organization for Standardization)の両方に提出し、公式規格として公開しています。
SecurityEdit
.NET Framework には、2 つの一般的な機能を持つ独自のセキュリティ メカニズムがあります。 コード アクセス セキュリティ (CAS)、および検証と確認です。 CAS は、特定のアセンブリに関連付けられた証拠に基づいています。 一般的には、アセンブリのソース(ローカルマシンにインストールされているか、インターネットからダウンロードされているか)が証拠となります。 CASはエビデンスを用いて、コードに付与された権限を判断する。 他のコードは、呼び出したコードに特定の許可を与えることを要求できる。 コールスタック内の各メソッドのすべてのアセンブリに必要な許可が与えられているかどうかがチェックされ、許可が与えられていないアセンブリがあると、セキュリティ例外がスローされます。
マネージド CIL バイトコードは、難読化されていない限り、ネイティブ コードよりもリバース エンジニアリングが容易です。 .NET のデコンパイラ プログラムを使用すると、リバース エンジニアリングのスキルを持たない開発者でも、難読化されていない .NET アセンブリの背後にあるソース コードを見ることができます。 一方、ネイティブマシンコードにコンパイルされたアプリは、リバースエンジニアリングが非常に困難であり、主にコンパイラの最適化とリフレクションの欠如により、ソースコードが正常に生成されることはほとんどありません。 そのため、ビジネス界では、企業秘密が失われたり、ライセンス管理の仕組みが迂回されたりする可能性が懸念されています。 この問題を軽減するために、マイクロソフト社は2002年からVisual Studio .NETにDotfuscator Community Editionを同梱しています。 また、VMware社、V.i.Labs社、Turbo社、Red Gate Software社などのサードパーティ製難読化ツールも提供されています。
メモリ 管理
CLR は、開発者をメモリ管理 (割り当て、完了したら解放) の負担から解放します。 .NETタイプのインスタンス(オブジェクト)は、CLRが管理するメモリのプールであるマネージドヒープから割り当てられます。 オブジェクトへの参照が存在する限り、そのオブジェクトは使用されているとみなされます(直接、またはオブジェクトのグラフを介して)。
.NET Frameworkには、アプリケーションのスレッドとは別のスレッドで定期的に実行されるガベージコレクタ(GC)が含まれており、使用できないオブジェクトをすべて列挙し、それらに割り当てられたメモリを取り戻します。 このGCは、非決定論的でコンパクトなマークアンドスウィープ方式のガベージコレクタです。 GCは、設定された量のメモリが使用されたとき、またはシステム上でメモリに対する十分な圧力があるときにのみ実行されます。 メモリを取り戻す条件にいつ達するかは保証されていないので、GCの実行は非決定論的である。 各.NETアプリケーションは、マネージドヒープ上のオブジェクト(マネージドオブジェクト)へのポインタであるルートのセットを持っています。 これには、スタティックオブジェクトへの参照、現在スコープ内にあるローカル変数またはメソッドパラメータとして定義されたオブジェクト、およびCPUレジスタによって参照されるオブジェクトが含まれます。 GCが実行されると、アプリケーションが一時停止し、ルートで参照されている各オブジェクトについて、ルートオブジェクトから到達可能なすべてのオブジェクトを再帰的に列挙し、到達可能であるとマークします。 CLIのメタデータとリフレクションを使用して、オブジェクトによってカプセル化されたオブジェクトを発見し、それらを再帰的にウォークします。 その後、リフレクションを使用して、ヒープ上のすべてのオブジェクトを列挙します(最初は連続して割り当てられていました)。 到達可能とマークされていないオブジェクトはすべてゴミとなります。 これがマークフェーズです。 ガベージが保持しているメモリは重要ではないので、フリースペースとみなされます。 しかし、最初は連続していたオブジェクトの間には、空きスペースの塊が残ります。 その後、オブジェクトが圧縮され、管理されているヒープ上の空き領域が再び連続したものになります。 オブジェクトの移動によって無効になったオブジェクトへの参照は、GCによって新しい場所を反映して更新されます。 ガベージコレクションが終了すると、アプリケーションが再開されます。
.NET Frameworkで使用されているガベージコレクタは、世代別にもなっています。 オブジェクトには世代が割り当てられます。 新規に作成されたオブジェクトには第0世代のタグが付けられ、1回のガベージコレクションに耐えたオブジェクトには第1世代のタグが付けられます。 第1世代のオブジェクトで、さらにガベージコレクションに耐えたものは第2世代となります。 フレームワークは第2世代までのオブジェクトを使用します。 世代の高いオブジェクトは、世代の低いオブジェクトよりも少ない頻度でガベージコレクションされます。 古いオブジェクトは新しいオブジェクトよりも寿命が長い傾向があるため、これによりガベージコレクションの効率が上がります。
PerformanceEdit
アプリケーションが最初に起動したとき、.NET Framework は just-in-time コンパイラを使用して CIL コードを実行可能なコードにコンパイルし、実行可能なプログラムを .NET Native Image Cache にキャッシュします。 キャッシュのおかげで、次回以降の起動は速くなりますが、初回の起動は通常遅くなります。
環境に統合されているガベージ コレクタは、開発者が直接制御できない予期しない実行の遅延を引き起こす可能性があります。 “
.NET Frameworkでは、Visual Studio 2013 Update 2において、2014年4月からマネージドコードによるStreaming SIMD Extensions (SSE)の呼び出しをサポートしています。 しかし、Monoは2009年のバージョン2.2から、Mono.Simd名前空間内でSIMD Extensionsのサポートを提供してきました。 MonoのリードデベロッパーであるMiguel de Icaza氏は、このSIMDサポートがCLRのECMA規格に採用されることに期待を寄せている。 ストリーミングSIMD拡張は、Pentium IIIの登場以来、x86系CPUで利用可能となっている。 また、ARMやMIPSなど他のアーキテクチャでもSIMD拡張機能を持つものがあります。 CPUがこれらの拡張機能をサポートしていない場合は、ソフトウェアで命令をシミュレートしています
。