.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 フォーラム 新着記事
  • Python 3の組み込み関数を速攻理解しよう: 後編 (2017/4/28)
     Python 3の組み込み関数のうち、オブジェクトやクラス、スコープ、コードの動的評価、ファイルや標準入出力を扱うものを取り上げる
  • 配列のコピーを1行でするには? (2017/4/26)
     配列をコピーするには、for/foreachループを使う方法もあるが、ArrayクラスのCopyメソッドを使うのが一番簡単で速度の面でも有利である
  • Microsoft Small Basic (2017/4/25)
     Microsoft Small Basicは学習を目的としてマイクロソフトが提供しているBASICの処理系。シンプルな言語仕様、習得が容易、簡潔な記述がその特徴
  • 第2回 Visual Studio 2017の基礎を知る (2017/4/21)
     開発環境Visual Studio 2017を使ったプログラミングに不可欠な知識とは? ソリューションの概念から画面構成まで基礎を説明
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

イベントカレンダー

PickUpイベント

- PR -

アクセスランキング

もっと見る

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

注目のテーマ

Insider.NET 記事ランキング

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