.NET TIPS

プログラムからソース・コードをコンパイルするには?

デジタルアドバンテージ
2003/12/19

 .NET Frameworkのクラス・ライブラリには、プログラムの実行時にソース・コードをコンパイルしてアセンブリを作成する機能が用意されている。例えば、ASP.NETはWebページがアクセスされたときにaspxファイルをC#やVisual Basic .NET(以下VB.NET)のソース・コードへ変換し、さらにそれをコンパイルして実行しているが、ソース・コードのコンパイル時にはこの機能を利用している。

C#のソース・コードをコンパイル

 次のサンプル・プログラムは、プログラム中に文字列として埋め込んだC#のソース・コードを「cshello.exe」という実行ファイルへコンパイルする。実行すればカレント・ディレクトリにcshello.exeが作成されるはずだ。

// cscompile.cs

using Microsoft.CSharp;
using System.CodeDom.Compiler;

public class test {
  static string cs = @"
    public class CSHello {
      static void Main() {
        System.Console.WriteLine(""Hello C# World!"");
      }
    }";  // 文字列として埋め込んだC#コード

  static void Main() {
    CSharpCodeProvider cscp = new CSharpCodeProvider();
    ICodeCompiler cc = cscp.CreateCompiler();

    CompilerParameters param = new CompilerParameters();
    param.OutputAssembly = "cshello.exe";
    param.GenerateExecutable = true;

    cc.CompileAssemblyFromSource(param, cs);
  }
}

// コンパイル方法:csc cscompile.cs
C#のソース・コードをコンパイルするC#のサンプル・プログラム(cscompile.cs)

 C#のソース・コードをプログラム内でコンパイルするには、まずCSharpCodeProviderクラス(Microsoft.CSharp名前空間)のインスタンスを作成し、CreateCompilerメソッドを呼び出してコンパイルを実際に実行するICodeCompilerインターフェイス(System.CodeDom.Compiler名前空間)を実装したオブジェクトを取得する。このオブジェクトは実際にはCSharpCodeGeneratorクラスのオブジェクトであるが、インターフェイスを経由して参照することにより、それ以降のコードで特定のコンパイラによらないコーディングができるようになる(すぐ後でVB.NETのコードを埋め込んだ場合の例を示す)。

CSharpCodeProvider cscp = new CSharpCodeProvider();
ICodeCompiler cc = cscp.CreateCompiler();

 次にコンパイル時に必要なパラメータをCompilerParametersクラス(System.CodeDom.Compiler名前空間)により作成する。ここでは、コンパイルにより作成されるファイルの名前をOutputAssemblyプロパティで指定し、また、出力されるファイルが実行可能ファイル(.exeファイル)となるようにGenerateExecutableプロパティをtrueに指定している(デフォルトでは.dllファイルが作成される)。

CompilerParameters param = new CompilerParameters();
param.OutputAssembly = "cshello.exe";
param.GenerateExecutable = true;

 最後にCompileAssemblyFromSourceメソッドを呼び出せば、実際にコンパイルが実行され、ファイルが出力される。

cc.CompileAssemblyFromSource(param, code);

 ここでは省略したが、このメソッドはコンパイル結果としてCompilerResultsクラス(System.CodeDom.Compiler名前空間)のオブジェクトを返す。埋め込んだソース・コードに誤りがある場合には、このオブジェクトのプロパティによりコンパイル・エラーを知ることができる。

Visual Basic .NETのソース・コードをコンパイル

 同様に、次のサンプル・プログラムは、プログラム中に文字列として埋め込んだVB.NETのソース・コードをコンパイルして実行可能ファイルを出力する。

// vbcompile.cs

using Microsoft.VisualBasic;
using System.CodeDom.Compiler;

public class test {
  static string vb = @"
    Class VBHello
      Shared Sub Main()
        System.Console.WriteLine(""Hello VB.NET World!"")
      End Sub
    End Class";  // 文字列として埋め込んだVB.NETコード

  static void Main() {
    VBCodeProvider vbcp = new VBCodeProvider();
    ICodeCompiler cc = vbcp.CreateCompiler();

    CompilerParameters param = new CompilerParameters();
    param.OutputAssembly = "vbhello.exe";
    param.GenerateExecutable = true;

    cc.CompileAssemblyFromSource(param, vb);
  }
}

// コンパイル方法:csc vbcompile.cs
VB.NETのソース・コードをコンパイルするC#のサンプル・プログラム(vbcompile.cs)

 ソース・コードがVB.NETの場合には、CSharpCodeProviderクラスの代わりに、VBCodeProviderクラス(Microsoft.VisualBasic名前空間)を使用する。

 なお、ここで解説したコンパイルを行うクラスでは、コンパイル時にコマンドライン版のコンパイラ(csc.exeやvbc.exe)を呼び出しているようで、それらが正しくインストールされていなければ、コンパイラが見つからないというエラーが発生する。End of Article

カテゴリ:クラス・ライブラリ 処理対象:コンパイラ
使用ライブラリ:CSharpCodeProviderクラス(Microsoft.CSharp名前空間)
使用ライブラリ:ICodeCompilerインターフェイス(System.CodeDom.Compiler名前空間)
使用ライブラリ:CompilerParametersクラス(System.CodeDom.Compiler名前空間)
使用ライブラリ:CompilerResultsクラス(System.CodeDom.Compiler名前空間)
使用ライブラリ:VBCodeProviderクラス(Microsoft.VisualBasic名前空間)
 
この記事と関連性の高い別の.NET TIPS
プログラムからソース・コードをコンパイルして実行するには?
C#のソース・コードを実行するには?
[ASP.NET]ページから生成されたソース・コードを見るには?
OSに標準付属のC#/VBコンパイラーでソースコードをコンパイルするには?
C#のコードをVBに、VBのコードをC#に変換するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」

@IT Special

- PR -

TechTargetジャパン

Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

ホワイトペーパーTechTargetジャパン

注目のテーマ

Insider.NET 記事ランキング

本日 月間
ソリューションFLASH