Windows上で利用出来る無料のプログラム開発環境は幾つかある。
そんな中で、C言語、C++、C#などのC関連でワテが知っているのは以下の通り。
Visual Studio 2015 Community ワテ使用中
Visual Studio 2017 Community RC ワテ使用予定
SharpDevelop
MonoDevelop
GNUコンパイラ(C、C++、Objective-C、Objective-C++、Fortran、Java、Ada、Go)
Delphi 10.1 Berlin Starter Edition
これら以外にも沢山ある。
オープンソースの項目で挙げたSharpDevelopやMonoDevelopは昔少し試した事があるが、詳しい事はよく知らない。
知っているのはオープンソースと言う事と、.NET Framework に対応しているのかな?
でもまあ、.NET Frameworkをやるんならわざわざそんなのを使わなくてもマイクロソフト純正のVisual Studioを使うのが一番だろう。
なんといっても .NET Frameworkの開発元がマイクロソフト社なのだから。
ちなみに、エンバカデロ・テクノロジーズ社が扱っているDelphiは以前はボーランド社の製品だった。
ボーランド (Borland) と言えば、Turbo Pascal(ターボ・パスカル)などが有名だった会社であるが、ワテは使った事は無い。
当記事では、Visual Studio超初心者の人向けにプログラミングの入門編講座を執筆する事にした。
第一回目はC#のコンソールアプリを作る。
では、本題に入ろう。
.NET Frameworkとは何か?
それを説明するのはワテには難しい。
- 点ネット
- ポチネット
- 小数点ネット
でも無く、ドットネットと読むのが正しい。
詳しい説明は、公式サイトなどの解説を読んで頂くのが良いだろう。
でもまあ、ワテの理解では、元々マイクロソフト社のプログラム開発環境と言うと、
- Microsoft Visual Basic
- Microsoft Visual C++
などのコンパイラ製品があった。
そこに新たに登場したのが、.NET Frameworkの技術を採用した以下の新しい製品(言語)だ。
- Microsoft Visual Basic .NET 通称 VB.NET Ver 1.0 は2002年にリリース
- C Sharp Ver 1.0が2002年4月にリリース、Visual C#が正式名称なのかな?
これらの言語の特徴としては、プログラムをビルド(=コンパイル)すると、他の言語と同じく .exe や.dll などのファイルが出力されるが、それはMSIL(Microsoft Intermediate Language)中間コードと言う言語で書かれている。
その .exe を実行すると、MSILが .NETのJITコンパイラにより最適化されたネイティブコードに変換されて実行されると言う仕組みだ。
その辺りが、.NET Frameworkを使ったプログラミング言語の特徴だ。
これから習うC#も、ビルドするとMSIL中間コードに変換される。
.NET Frameworkの何が良いのか?
あくまでワテの理解で説明するなら、
VB.NETやC#などの .NET Framework対応の言語でプログラムを書けば、コンパイルするとまずはMSIL中間コードに変換される。
なので、マイクロソフトのエンジニアの人は、MSIL言語からexeやdllなどのネイティブコードを生成する部分を改良すれば、VB.NETやC#のどちらの性能も上がる。
マイクロソフトには他にもF#と言う言語もあるが、ワテは使った事は無いのだが、#が付いているのでこれも.NET Framework対応の言語だ。
そう言う訳で、多数の言語を開発しているマイクロソフト社としては、.NET Frameworkの技術をコンパイラやWindowsオペレーティングシステムに広く採用する事によって、マイクロソフト社内での製品開発環境を統合したいのかもしれない。そして、ワテみたいなプログラム開発する側の人間も、その統合開発環境を使うと何かと便利になる。
まあ、ワテの場合には、.NET Frameworkと言うとそんな理解なのだが。
ちなみに、マイクロソフト社には、従来からあるCコンパイラも製品系列にはある。
だ。
これは、.NET Frameworkを使わない従来通りC++のコンパイラだ。
C++はC言語の上位互換性があるので、C++の文法を使わずにC言語だけの文法でプログラムを書けば、Cプログラムとしてコンパイルする事も可能なので、C言語、C++のどちらも勉強出来る。
昔からWindowsプログラミングをやっている人なら、このMicrosoft Visual C++を使って、以下の便利なクラスライブラリを使ってWindowsアプリを作っている人も多いだろう。
- Microsoft Foundation Class (MFC) Visual C++用のWindows用アプリケーション構築のためのアプリケーションフレームワーク(クラスライブラリ)
- Active Template Library (ATL) COMプログラミングを簡単に行えるようにするためのマイクロソフトによるテンプレートベースのC++専用ライブラリ。
引用元 Microsoft Visual C++のWikipedia
まあ、ワテの場合にも、今でも時々 Microsoft Visual C++でプログラムを書く事もある。
これらの VB.NET、C#、Microsoft Visual C++は全て無料版のVisual Studio Community でも利用出来るので、これからプログラミングを勉強する人には最適だ。
また、
と言う言語もあり、これは、Microsoft Visual C++とC#の両方の言語を混ぜて書く事が出来る、超難解な言語である(ワテの感想)。
ワテも少し使えるが、使いこなせるレベルには程遠い。
ワテの理解では、どういう場面でこのC++/CLIを使うかと言うと、例えば、ユーザインタフェースを作るならMFCよりもC#のFormプロジェクトが扱い易い。
一方、ロジックの部分は使い慣れたMicrosoft Visual C++で書くなどの使い方が思い浮かぶ。
さて、.NET Frameworkを使う上で注意しておく事が一つある。
.NET Frameworkは逆コンパイルが簡単に出来てソースコード丸見え!
上で説明したようにVB.NET、C#などの.NET Framework言語で書いた場合には、プログラムをビルドして生成される .exeや.dllファイルは、完全な機械語には置き換わっていない。MSILと言う中間言語のままなのだ。
なので、逆コンパイルすれば簡単に元のVB.NETやC#のソースコードが復元出来る。
確か、コメントとか変数名もそのまま復元出来るのだったかな?その辺りは忘れた。
逆コンパイルツールも多数あり、フリーなものだけでなくマイクロソフト社純正の物もあったように思うが忘れた。
ワテが良く使うのは
- ILSpy http://ilspy.net/
- dotPeek https://www.jetbrains.com/decompiler/
だ。
VB.NETをC#に変換、C#をVB.NETに変換なども自由自在
VB.NETやC#をコンパイルして生成されるexeやdllはMSIL中間コードで記述されている。
それらは完全な機械語では無いのだ。
その結果、逆コンパイルも簡単に出来てしまう。
その性質を利用すると、以下の作業を簡単に行う事が可能だ。
VB.NETとC#の間でソースコードを相互に変換出来る
VB.NETソースコードをC#ソースコードに変換
C#ソースコードをVB.NETソースコードに変換
無料で利用出来るオンライン変換サイトも多数あるが、例えばこのサイトは有名だ。
このツールを使えば、ネットで見付けたVB.NETのサンプルコードをC#に変換するなども可能なので、C#初心者の人には嬉しいサービスだ。
まあ、兎に角.NET Frameworkで作ったプログラムはソースコードが丸見えになると言う点は注意しておく必要がある。
もし丸見えが困る人は、
- .NET Native
- 難読化
などで調べると良いだろう。
.NET Nativeには期待しているのだが、確か、現状ではWindows ストアアプリのみ対応なのかな?コンソールアプリとかWindowsフォームアプリみたいな普通のアプリはネイティブなコードはまだ出ないのかな?
その辺りは今後調査したい。
.NET Framework関連でここまでのまとめ
Windows環境に於いて、無料のプログラミング開発環境を探しているんなら、Visual Studio Community がお勧めだ。
- VB.NET
- C#
- Microsoft Visual C++
- その他
が無料で利用出来る。
C#コンソールアプリケーションを作る
さて、前置きが大変長くなってしまったが、今回はVisual Studio Community 2015のC#を使ってコンソールアプリケーションを作ってみよう。
コンソールアプリケーションとは、コンソールウインドウを開くアプリである。
もう一つのアプリケーションとしては、Windowsフォームアプリケーションがある。
こちらはウインドウを開いて、ボタンや入力欄などの部品を持つGUI(グラフィカルユーザーインターフェース)を作成する場合に使う。
コンソールアプリケーションの用途としては、例えば、何かのファイルを読み込んで処理して出力するなど、ユーザーインターフェースを必要としないアプリに向いている。
では、早速コンソールアプリケーションの作成を開始してみる。
Visual Studio Communityのインストール
Visual Studioのインストール記事は他の記事で幾つか書いているので参照して頂きたい。
詳しく説明しているので、初めての人でも簡単にVisual Studioがインストール出来るはずだ。
またインストール後のカスタマイズや、カスタマイズした設定を保存しておく手法。
あるいは保存した設定を読み込む手法なども説明しているので、一読されると良いだろう。
設定さえ保存しておけば、いろいろ弄ってメニューの項目とか、ドッキングウインドウが訳分からない状態になっても、元に戻せる。
Visual Studio Communityの起動
早速起動してみる。
ちなみに下の画面はWindows10x64だ。スタートボタンが貝殻のアイコンになっているがClassic Shellと言うWindows10のメニューをWindows 7風にする有名なフリーソフトを入れている。とても使い易い。
下図がVisual Studioの起動直後の画面。
上図のようにワテの場合には、管理者でVisual Studioが起動出来るようにしている。
でも、普通の人は管理者モードで起動する必要は無い。ASP.NETのプロジェクトでIISサーバーを相手にデバッグする場合に管理者モードが必要となる。
新規のC#のコンソールアプリプロジェクトを作成する
ファイル
新規作成
プロジェクト
を開く。
下図のようにC#のコンソールアプリを選択する。
上図のように
名前
場所
を指定する。
ソリューションのディレクトリを作成はデフォルトでチェック済だが、まあ、その辺りは変更しないでそのまま使うと良い。好き好きだ。
ソリューションエクスプローラーの画面が出た
ソリューションエクスプローラーとは、左側に出ているウインドウだが、デフォルトでは右に出たと思う。ワテの場合には、それを左に配置している。
場所の変更は簡単で、そのウインドウをドラッグして好きな場所に移動すれば良い。
フローティング状態にも出来るし、Visual Studioウインドウの四辺のどこかにドッキングする事も可能だ。
C#のコンソールアプリを早速実行してみる
ツールバーにある実行アイコン(緑色▶)をクリックすると実行出来る。
上図のように出力ウインドウにずらずらとコンパル結果が表示され、その後、プログラムが起動する。
今の例では、コンソールウインドウが一瞬開いて直ぐ閉じるだろう。
実行は▶アイコンでも良いが、メニューから開く事も可能だ(下図)。
さて、コンソールウインドウに何も書かないのは芸が無いので、何か書いてみる。
Hello Kitty! と出力する
以下のようにプログラムを変更して実行▶をクリックする。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ワテのConsoleApplication { class Program { static void Main(string[] args) { Console.WriteLine("Hello Kitty!"); } } }
無事に出力されただろうか?
Hello Kitty!
と出力されれば成功だ。
なお、Hello Kitty! の使用に関しては、サンリオさんの許可は取っていない。
実行するたびにコンソールウインドウ位置が動くのが煩わしい。
実行開始時にコンソールウインドウ位置と大きさを指定する
デバッグでは何度も実行を繰り返す。
その場合に、コンソールウインドウ位置が自動で配置されるのだが、Windowsが勝手に位置を指定する。
前回位置より少しずらした位置に配置するのだ。
それが煩わしいので、ワテの場合には、以下の小細工を行う事により、プログラム実行時に、最初にコンソールウインドウ位置と大きさを指定している。
コンソールウインドウ位置と大きさを指定するC#コード
本邦初公開だ。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Runtime.InteropServices; // これを追加する。 namespace ワテのConsoleApplication { static class MyConsoleClass { public const int SWP_NOSIZE = 0x0001; [DllImport("kernel32.dll", ExactSpelling = true)] public static extern IntPtr GetConsoleWindow(); private static IntPtr MyConsole = GetConsoleWindow(); // dllの中のSetWindowsPos()関数を使う [DllImport("user32.dll", EntryPoint = "SetWindowPos")] public static extern IntPtr SetWindowPos( IntPtr hWnd, int hWndInsertAfter, int x, int Y, int cx, int cy, int wFlags); public static void set_pos_size(int xpos, int ypos, int wid, int hei) { // Consoleウインドウの位置とサイズ指定する。バッファーサイズはmaxにした。 SetWindowPos(MyConsole, 0, xpos, ypos, 0, 0, SWP_NOSIZE); Console.SetBufferSize(Console.BufferWidth, 32766);// バッファーサイズを最大化しておく Console.SetWindowSize(wid, hei);//(120, 60); } } class Program { static void Main(string[] args) { MyConsoleClass.set_pos_size(xpos: 100, ypos: 0, wid: 120, hei: 60); var msg = "Hello Kitty!"; Console.WriteLine(msg); // System.Console.ReadLine(); // 有効化するとDebug実行時に自動で閉じない。 } } }
上のコードの詳しい意味は、皆さん自身で調査願います。
DllImport("kernel32.dll", ...
DllImport("user32.dll", ...
こういうちょっと特殊な手法を使うと、C#のプログラムの中からWindowsが持っているAPIをコールする事が出来るのだが、ワテも単に見様見真似で使っているだけなので、詳しい説明は出来ない。
この部分では、32766と言う数字にしているが、この数字がコンソールウインドウに表示された文字を保持しておくバッファーのサイズだ。
Console.SetBufferSize(Console.BufferWidth, 32766);// バッファーサイズを最大化しておく
なので、例えば100とかの小さい数字にすると、沢山の文字を表示しても古い文字は消えて行く。ワテの場合デバッグ時にはコンソールウインドウに沢山の文字を書いて、それを必要ならコピペで取り出して、メモ帳などに貼って出力の内容をチェックしてデバッグに役立てるなどするのでバッファーは多目にしている。
この部分が、コンソールウインドウの大きさと位置を決めている。
MyConsoleClass.set_pos_size(xpos: 100, ypos: 0, wid: 120, hei: 60);
ワテの場合Windowsのツールバーは画面左側に縦置きにしている。
その幅が100ピクセルほどあるので、それを避ける為に xpos 100 にして少し右に寄せてコンソールウインドウを表示する。
wid, heiは文字数だ。なので横120文字、縦60行の範囲に出力できる。
このように設定しておくと快適にデバッグ作業が出来るようになると思う。
デバッガなどを適当に使ってみる
ブレークポイントを置いて、デバッグ実行するとそこで停止する。
停止したら、変数の中身などをローカルウインドウや自動変数ウインドウで確認も可能だ。
初めての人は、この辺りの機能をいろいろ使い込んで見てデバッグ作業を効率良く行えるようにする技術を身に付けると良い。
まとめ
全国のわれこブログファンの皆さん向けに、Visual Studioを使ってC#のコンソールアプリケーションを作成する手順の第一回目の説明を行った。
この説明では、デバッグ作業をやり易くするために、コンソールウインドウ位置と大きさを指定して自分好みの場所に配置する手法をマスターした。
次回は、何にしようかな?
検討中です。
なお、Visual StudioやC#などを現在勉強中の初心者の人で、当記事やVisual Studio、C#などに何か疑問などありましたら、コメント欄からお問い合わせ下さい。
先着10億名様に限り、ワテが分る範囲で回答します。
ただし、体調が悪い場合には回答出来ない場合もあります。
ご了承下さい。
コメント