トップVisual Studio入門 > C#のコマンドライン・コンパイル

C#のコマンドライン・コンパイル

1.はじめに

Microsoft Visual Studio Express 2012 for Windows Desktop をインストールすると、C:\Windows\Microsoft.NET\Framework\v4.0.30319 の下に Visual C# Command Line Compiler である csc.exe が置かれる。

このディレクトリを環境変数 Path に追加した。

一般に、Path以外にも環境変数の設定が必要である。 このため、コマンドプロンプト画面を立ち上げたとき、最初に vcvars32.bat を実行する。

C:\mh\mcc>vcvars32
Setting environment for using Microsoft Visual Studio 2010 x86 tools.

最初に、次のプログラムをコンパイルしてみょう。

using System;

class HelloWorld {
    public static void Main() {
        Console.WriteLine("Hello World!!");
    }
}

このプログラム hello.cs を c:\mh\mcc\cs に置き、以下のようにコンパイル・実行した。

c:\mh\mcc>csc cs\hello.cs
Microsoft (R) Visual C# Compiler Version 4.0.30319.17929
for Microsoft (R) .NET Framework 4.5
Copyright (C) Microsoft Corporation. All rights reserved.

c:\mh\mcc>hello
Hello World!!

次のように、/nologoオプションを使えば、ロゴの表示を抑止できる。

C:\mh\mcc>csc /nologo cs\hello.cs

C:\mh\mcc>hello
Hello World!!

2.GUIアプリケーションのコンパイル

hello.cs はコンソール・アプリケーションであるが、 GUIアプリケーションも同じようにコンパイルできる。

using System;
using System.Drawing;
using System.Windows.Forms;

class Program
{
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Form form = new Form1();
        form.Text = "Menu Test";  // フォームのタイトル
        Application.Run(form);
    }
}

class Form1 : Form
{
    MenuStrip menuStrip = new MenuStrip();

    public Form1()
    {
        ToolStripMenuItem menuFile = new ToolStripMenuItem();
        menuFile.Text = "ファイル(&F)";

        ToolStripMenuItem menuAcs = new ToolStripMenuItem();
        menuAcs.Text = "アクセサリ(&A)";

        ToolStripMenuItem mi1 = new ToolStripMenuItem("電卓(&C)");
        mi1.Click += new EventHandler(onClick);
        mi1.Image = Image.FromFile(@"c:\mh\mcc\ico\calc.ico");

        ToolStripMenuItem mi2 = new ToolStripMenuItem("時計(&T)");
        mi2.Click += new EventHandler(onClick);
        mi2.Image = Image.FromFile(@"c:\mh\mcc\ico\clock.ico");

        ToolStripSeparator tsSep = new ToolStripSeparator();

        ToolStripMenuItem miExit = new ToolStripMenuItem("終了(&X)");
        miExit.Click += new EventHandler(onExitClick);

        menuAcs.DropDownItems.AddRange(new ToolStripItem[] { mi1, mi2, tsSep, miExit });

        menuStrip.Items.AddRange(new ToolStripItem[] { menuFile, menuAcs });

        this.Controls.Add(menuStrip);
        this.MainMenuStrip = menuStrip;
 
    }

    void onClick(object sender, EventArgs e)
    {
        MessageBox.Show(((ToolStripMenuItem)sender).Text + "が選択されました", "Menu選択");
    }

    void onExitClick(object sender, EventArgs e)
    {
        this.Close();
    }
}

正常にコンパイルでき、 下図に示すように Visual Studio でコンパイル・実行した結果と一致することを確認した。

2.1 /target:winexe オプション

GUIアプリケーションを csc guiapp.cs としてコンパイルすると、 プログラムを実行するたびにコマンドプロンプトが出る。 このコマンドプロンプトの表示をやめるためには /target:winexe というオプションを付ける[1]。

  csc /target:winexe guiapp.cs

この /target:winexe オプションを付けてコンパイルした場合、 たとえコマンドプロンプト画面から起動したとしても、 Console.WriteLineメソッド等によるコンソール画面(コマンドプロンプト画面)への表示は起きない。 従って、デバッグ段階でConsole.WriteLineメソッド等による表示を望むときは、 このオプションなしでコンパイルし、完成版はオプションを付けてコンパイルすればよい。

3.エラー

これまでは、プログラムで次の vc.bat を実行していた。
[vc.bat]

cd c:\sys
vcvars32

1年余り問題なく動いいていたが、今日[2014.12.30]、急に

ERROR: Cannot determine the location of the VS Common Tools folder.
というエラーが出るようになった。

ネット検索で調べてみると、どうもセキュリティが関係しているようだ。 エクスプローラで c:\Windows\System32\cmd.exe をクリックするか、 デスクトップに置いた cmd.exe のショートカットをクリックして cmd.exe を起動して、 そこから vcvars32.bat を実行すると上のエラーは出ない。

updateか何かで、セキュリティに関する条件が変わってしまったようだ。 少なくとも当面はプログラムからの起動をやめてショートカットをクリックして cmd.exe を起動し、 vcvars32.bat を実行することにする。


[2015.1.24]

カレントディレクトリが c:\sys の場合、上のエラーが出るが、 カレントディレクトリが c:\sys\bin とか、c:\Windows\System32 の場合、問題はない。

セキュリティではなく、アップデートで環境変数に問題が起きたのかもしれない。 vc.bat は次のように変更すれば、プログラムから正常に実行できるようになった。
[vc.bat]

cd c:\windows\system32
call vcvars32
cd c:\sys

A.参考文献

[1] GUI アプリケーション