DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

アプリケーションのエントリポイントを自作する

アプリケーションのエントリポイントとは、アプリケーションを開始したときにはじめに実行される場所のことです。Visual Studioを使って開発しているならば自動的に作成されるため特に意識する必要はありませんが、エントリポイントがどこであるかを知っておくことは必要です。また、エントリポイントを自分で記述しなければならないケースもあるでしょう。

エントリポイントは、VB.NETではSub Mainプロシージャで、C#では静的なMainメソッドです。

VB.NETではこちらで紹介しているようにフォームクラスをアプリケーションのスタート位置に指定することもできますが、その場合はコンパイラによって自動的にSub Mainが作成され、エントリポイントとなります。

Visual Studioが作成するエントリポイントの位置と内容

まずは、Visual StudioでWindowsアプリケーションのプロジェクトを新規作成した直後の、既定のエントリポイントについて確認しておきましょう。

VB.NETの場合

VB.NETでは、Sub Mainは存在しません。フォームクラスがスタート位置に指定されており、コンパイラがエントリポイントとなるSub Mainを作成します。

補足:自動的に作成されるSub Mainは、Visual Studio 2005以降でアプリケーションフレームワークを有効にしているならば、MyApplicationクラスに作成されます。それ以外では、フォームクラスに作成されます。

C#の場合

C#では、Visual Studio 2003以前とVisual Studio 2005以降で異なります。

Visual Studio 2003以前では、フォームクラス(Form1クラス)にMainメソッドが作成され、エントリポイントになります。そのコードは、次のようなものです。

C#
コードを隠すコードを選択
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main() 
{
    Application.Run(new Form1());
}

Visual Studio 2005からは、Program.csファイルのProgramクラスにMainメソッドが作成されます。コードは、次のようなものです。

C#
コードを隠すコードを選択
/// <summary>
/// アプリケーションのメイン エントリ ポイントです。
/// </summary>
[STAThread]
static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Application.Run(new Form1());
}

これらのコードは、Visual Studioのデザイナが管理しているコードに当たりませんので、ユーザーが直接書き換えても問題ありません(もちろん正しいコードを書く必要はありますが)。よって、C#では新たにMainメソッドを作成しなければならないケースはほとんど無いでしょう。

Mainメソッドを作成する

エントリポイントにするMainメソッドを記述する場所はどこでも構いませんが、新たにMainメソッドを作成するのであれば、新しいクラスを作成し、そこに記述をするのが分かりやすいでしょう。

VB.NETの場合

VB.NETの場合は、プロジェクトに新しいクラスかモジュールを追加します。メニューの「プロジェクト」-「新しい項目の追加」で追加できます。そしてそこにSub Mainを記述します。

以下はSub Mainをモジュールに記述したときの例です。

VB.NET
コードを隠すコードを選択
Module Program
    <STAThread()> _
    Sub Main()
        Application.Run(New Form1())
    End Sub
End Module

以下はSub Mainをクラスに記述したときの例です。

VB.NET
コードを隠すコードを選択
Public Class Program
    <STAThread()> _
    Shared Sub Main()
        Application.Run(New Form1())
    End Sub
End Class

なお、.NET Framework 2.0以降の場合は、次のようにしたほうがよいでしょう。(モジュールの例のみを示します。)

VB.NET
コードを隠すコードを選択
Module Program
    <STAThread()> _
    Sub Main()
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(False)
        Application.Run(New Form1())
    End Sub
End Module

C#の場合

C#の場合は、新しいクラスをプロジェクトに作成して、静的なMainメソッドを記述します。Mainメソッドのコードは、前述したVisual Studioが作成するコードをそのまま使えばよいでしょう。

エントリポイントを変更する

新しく作成したMainメソッドをエントリポイントにするには、エントリポイントを変更する操作が必要です。エントリポイントを変更する方法は、「アプリケーションが始まるときに呼び出す位置(エントリポイント)を変更する」で説明しています。

上記コードの詳しい説明

気になる方のために、上に示したコードの説明もしておきましょう。

Application.Runメソッドについては、こちらで説明しています。STAThreadAttribute属性の必要性については、こちらで説明しています。

Application.EnableVisualStylesは、コントロールをXPスタイルで表示するためのものです。この説明は、こちらで行っています。

Application.SetCompatibleTextRenderingDefaultについて

.NET Framework 2.0から追加されたApplication.SetCompatibleTextRenderingDefaultメソッドは、LabelやButtonBaseなど一部のコントロールが持つUseCompatibleTextRenderingプロパティの既定値を指定するものです。

UseCompatibleTextRenderingプロパティは、コントロールが文字列をどのように描画するかを指定するものです。UseCompatibleTextRenderingプロパティがTrueならば、.NET Framework 1.1以前と互換性のあるGDI+(Graphics.DrawStringやGraphics.MeasureStringメソッド)を使ってテキストを描画します。UseCompatibleTextRenderingプロパティがFalseならば、.NET Framework 1.1以前とは互換性の無いGDI(TextRenderer.DrawTextやTextRenderer.MeasureTextメソッド)を使った新しい方法でテキストを描画します。

なぜこのようなGDIを使った方法が必要になったかということに関してMSDN「Application.SetCompatibleTextRenderingDefault メソッド」では、「GDI+ にパフォーマンスとローカライズに関する問題があるから」とされています。

結論を簡単にいってしまうと、.NET Framework 1.1以前との互換性を重視するならば「Application.SetCompatibleTextRenderingDefault(False)」を呼び出すべきではありませんが(「Application.SetCompatibleTextRenderingDefault(True)」とする必要はありません)、それ以外では呼び出しておいたほうがよいでしょう。