.NET TIPS プログラムからソース・コードをコンパイルするには?デジタルアドバンテージ2003/12/19 |
![]() |
|
.NET Frameworkのクラス・ライブラリには、プログラムの実行時にソース・コードをコンパイルしてアセンブリを作成する機能が用意されている。例えば、ASP.NETはWebページがアクセスされたときにaspxファイルをC#やVisual Basic .NET(以下VB.NET)のソース・コードへ変換し、さらにそれをコンパイルして実行しているが、ソース・コードのコンパイル時にはこの機能を利用している。
C#のソース・コードをコンパイル
次のサンプル・プログラムは、プログラム中に文字列として埋め込んだC#のソース・コードを「cshello.exe」という実行ファイルへコンパイルする。実行すればカレント・ディレクトリにcshello.exeが作成されるはずだ。
|
|
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のソース・コードをコンパイルして実行可能ファイルを出力する。
|
|
VB.NETのソース・コードをコンパイルするC#のサンプル・プログラム(vbcompile.cs) | |
ソース・コードがVB.NETの場合には、CSharpCodeProviderクラスの代わりに、VBCodeProviderクラス(Microsoft.VisualBasic名前空間)を使用する。
なお、ここで解説したコンパイルを行うクラスでは、コンパイル時にコマンドライン版のコンパイラ(csc.exeやvbc.exe)を呼び出しているようで、それらが正しくインストールされていなければ、コンパイラが見つからないというエラーが発生する。
カテゴリ:クラス・ライブラリ 処理対象:コンパイラ 使用ライブラリ:CSharpCodeProviderクラス(Microsoft.CSharp名前空間) 使用ライブラリ:ICodeCompilerインターフェイス(System.CodeDom.Compiler名前空間) 使用ライブラリ:CompilerParametersクラス(System.CodeDom.Compiler名前空間) 使用ライブラリ:CompilerResultsクラス(System.CodeDom.Compiler名前空間) 使用ライブラリ:VBCodeProviderクラス(Microsoft.VisualBasic名前空間) |
|
![]() |
「.NET TIPS」 |
- 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
![]() |
||
|
||
![]() |