|
.NET TIPS プログラムからソース・コードをコンパイルして実行するには?デジタルアドバンテージ2003/12/19 |
![]() |
|
|
|
「TIPS:プログラムからソース・コードをコンパイルするには?」では、プログラム中に埋め込んだソース・コードをコンパイルして実行可能ファイルを出力する方法について解説したが、ここでは実行可能ファイルに出力せずに、コンパイル後に直接呼び出して実行してみる。
次のサンプル・プログラムは、文字列として埋め込んだソース・コードをプログラムの実行時にコンパイルし、さらにそれを実行するために、そのMainメソッドを呼び出す。結果として「Hello C# World!」のメッセージが出力される。
|
|
| ソース・コードをコンパイルし実行するC#のサンプル・プログラム(compileinvoke.cs) | |
今回のプログラムでは、ICodeCompilerオブジェクトのCompileAssemblyFromSourceメソッド呼び出し時に指定するコンパイルのパラメータで、GenerateInMemoryプロパティをtrueに設定する。これによりコンパイルされたアセンブリはファイルに出力されずにメモリ上にのみ作成されるようになる(実際にはソース・コードもアセンブリもいったん一時的なディレクトリに作成されているようだが)。
CompilerParameters param = new CompilerParameters();
param.GenerateInMemory = true;
CompileAssemblyFromSourceメソッドの呼び出したときには、その戻り値であるCompilerResultsオブジェクトのCompiledAssemblyプロパティにより、ロード済みのアセンブリへの参照を得ることができる。
CompilerResults cr = cc.CompileAssemblyFromSource(param, cs);
Assembly asm = cr.CompiledAssembly;
アセンブリへの参照があれば、それに含まれるCSHelloクラスの型情報をTypeクラス(System名前空間)のオブジェクトとして取得でき、さらにTypeクラスのGetMethodメソッドにより、Mainメソッドの情報をMethodInfoクラス(System.Reflection名前空間)のオブジェクトとして取得できる。
このようにしてMainメソッドについてのMethodInfoオブジェクトが取得できれば、そのメソッドをInvokeメソッドにより実際に呼び出すことができる。
Type type = asm.GetType("CSHello");
MethodInfo mi = type.GetMethod("Main");
mi.Invoke(null, null);
このような型やメソッドへのアクセスは、.NET Frameworkの機能の1つである「リフレクション」と呼ばれるものだ。
なお、ここで呼び出しているMainメソッドはstaticなメソッドであるため、型のインスタンス化は行っていない。![]()
| カテゴリ:クラス・ライブラリ 処理対象:コンパイラ カテゴリ:クラス・ライブラリ 処理対象:リフレクション 使用ライブラリ:CSharpCodeProviderクラス(Microsoft.CSharp名前空間) 使用ライブラリ:ICodeCompilerインターフェイス(System.CodeDom.Compiler名前空間) 使用ライブラリ:CompilerParametersクラス(System.CodeDom.Compiler名前空間) 使用ライブラリ:CompilerResultsクラス(System.CodeDom.Compiler名前空間) 使用ライブラリ:Typeクラス(System名前空間) 使用ライブラリ:Assemblyクラス(System.Reflection名前空間) 使用ライブラリ:MethodInfoクラス(System.Reflection名前空間) 関連TIPS:プログラムからソース・コードをコンパイルするには? |
|
||||||||||||||||||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


