24: .NETのVisualC++を理解する
概要
前回の記事 で作成したチートクライアントをGUIでカッコよくするために、.NET Frameworkを使用します。今回は、.NETのVisualC++を理解する事を目標に書いていきます。
.NET Framework とは
今まで、Windows OS の機能(システムコール等)を使う時は Windows API を使用してきました。GUIに関しても、例えばウィンドウの作成は CreateWindowEx というWindowsAPIを使えばできるっちゃできます。しかし、
CreateWindowEx
の引数を見てわかる通り、
一つのウィンドウを作るだけでも超めんどくさいですし、これにボタンとかを付け足すとなると米の数を数えるほどめんどくさいです。
しかし、.NET Frameworkを使用する事でGUIの作成なども簡単に行う事ができます。※ .NETはGUIを作るための物では無いです。
.NET Frameworkはアプリケーションをビルドするためのツール、プログラミング言語、ライブラリ等を色々ひっくるめたプラットフォームの事です。
なので、単に.NET Frameworkはコレの事ですという風に示せないのでわかりづらいですが、GUIを視覚的に組み立てられるようにしてくれたり、 C++/CLIという便利なプログラミング言語を提供してくれていたり するのが.NETです。
マネージドコード と アンマネージドコード
.NET Frameworkには実行環境も含まれています。.NETでビルドした一部の実行ファイルは普通のx86の機械語にコンパイルされるのではなく、MSIL (MicroSoft Intermediate Language) という中間言語にコンパイルされます。これは.NETの CLR (Common Language Runtime) 環境上で動かせる形式です。 CLR環境でこの中間コードを実行すると、JIT (Just In Time)コンパイラによって普通の機械語に変換されながら実行されます。
要は、一部の.NETアプリは普通のバイナリではなく、中間言語としてコンパイルされ、CLR環境が無いと実行できないという事です。
しかし、"一部" と書いた通り、.NETで開発した全てのアプリがMSILにコンパイルされるわけではありません。
.NETでは、マネージドコードとアンマネージドコードの二種類のコードがあり、マネージドコードで書いたアプリのみがMSILにコンパイルされます。 逆に、アンマネージドコードで書いたアプリは普通のバイナリと同じようにコンパイルされ、同じように実行されます。
Visual C++ とは
.NET Frameworkを使ったアプリケーションを作成するには、複数のプログラミング言語が使えます。Visual Basic や Visual C# 等が有名どころですが、今回は Visual C++ を使用します。
WindowsのGUIアプリを作る際はVisual C#とかが有名で、Visual C++は逆にマイナーであまり推奨されてない気さえしますが、 マネージドコードしか使用できないVisual C#とは違い、Visual C++ はマネージドコードとアンマネージドコードを唯一混在させられる言語という強い特徴があります。
GUIだけで見ればマネージドコードだけで十分ですが、"チート" と言うものは機械語を操作したりなどかなり低レイヤーの内容を扱うので、 例えばDLL Inject等の機能を書きたい場合はアンマネージドコードの方が便利です (アンマネージドコードじゃないと書けない場合もあります)。
マーシャリング
Visual C++でマネージドコードを書く場合は、C++/CLIというプログラミング言語を使います。C++/CLI は C++ を拡張した言語ですが、型の種類から違うなど結構大きく異なります。 例えば、
int
型は、マネージドコードではSystem::Int32
型になっています。マネージドコードとアンマネージドコードの変換の事をマーシャリングと言います。
基本的にマーシャリングは自動で行われるので、マネージドコードとアンマネージドコードの型の両方を混在させてても問題ありません。 しかし、文字列などに関してはマーシャリングライブラリ等を使用して手動で変換する必要が出てきたります。
チートクライアントで使用するのは
実際にこれから作るチートクライアントは、Visual C++ の C++/CLI言語 にて、マネージドコードとアンマネージドコードを混在して作ります。具体的なVisual Studioのテンプレートでいうと、「CLR 空のプロジェクト (.NET)」というので作っていきます。