// ソースコードの雛形 static string cs = @" using System.IO; using System.Text; public class CSHello { public static void kenmomen(string[] filenames) { コピペゾーン♪ } }"; // プラグイン呼び出し用のメソッドオブジェクト private MethodInfo miKenmomen; private void kenmomen(string[] filenames) { // リフレクションでプラグイン実行 this.miKenmomen.Invoke(null, new object[] { filenames }); } private void Form1_Load(object sender, EventArgs e) { CSharpCodeProvider cscp = new CSharpCodeProvider(); ICodeCompiler cc = cscp.CreateCompiler(); // コンパイルパラメータ(メモリ上にコンパイル、Exeではない。) CompilerParameters param = new CompilerParameters(); param.GenerateInMemory = true; param.GenerateExecutable = false; // プラグインソースコードを取得 // ここの文字コードはSJISかUTF8か悩みどころ string plugin = File.ReadAllText("kenmomen.cs", Encoding.UTF8); // ビルドに必要なDLLを追加 // これも動的に出来ないと詰む可能性あり。 // csファイルに参照DLLセクションを設けるなどの対応が必要。 param.ReferencedAssemblies.Add("Microsoft.CSharp.dll"); param.ReferencedAssemblies.Add("System.dll"); param.ReferencedAssemblies.Add("System.Core.dll"); param.ReferencedAssemblies.Add("System.Data.dll"); param.ReferencedAssemblies.Add("System.Data.DataSetExtensions.dll"); param.ReferencedAssemblies.Add("System.IO.dll"); param.ReferencedAssemblies.Add("System.Xml.dll"); param.ReferencedAssemblies.Add("System.Xml.Linq.dll"); // ソースコード雛形にプラグインをマージしてコンパイル CompilerResults cr = cc.CompileAssemblyFromSource(param, cs.Replace("コピペゾーン♪", plugin)); // コンパイルされた型とメソッドを取り出す。 Type type = cr.CompiledAssembly.GetType("CSHello"); this.miKenmomen = type.GetMethod("kenmomen"); }