メモ - (2008/10/16 (木) 16:51:00) の編集履歴(バックアップ)
C#で文字列からアセンブリを動的に生成する方法
using System;
using Microsoft.CSharp;
using System.CodeDom.Compiler;
using System.Reflection;
delegate int TestDelegate( int value );
が宣言済みとして,
CSharpCodeProvider provider = new CSharpCodeProvider();
CompilerParameters parameters = new CompilerParameters( new string[] { "Boare.Lib.Vsq.dll" } );
parameters.GenerateInMemory = true;
string code = "using Boare.Lib.Vsq;namespace a{public class foo{public static int bar( int value ){return value * 10;}}}";
CompilerResults results = provider.CompileAssemblyFromSource( parameters, code );
if ( results.Errors.Count != 0 ) {
for ( int i = 0; i < results.Errors.Count; i++ ) {
Console.WriteLine( " error=" + results.Errors[i].ErrorText );
}
throw new ApplicationException( "Errors.Count=" + results.Errors.Count );
}
Assembly testAssembly = results.CompiledAssembly;
Type fooType = testAssembly.GetType( "a.foo" );
MethodInfo mi = fooType.GetMethod( "bar" );
TestDelegate gtcd = (TestDelegate)Delegate.CreateDelegate( typeof( TestDelegate ), mi );
Console.WriteLine( "fooInstance.bar()=" + gtcd.Invoke( 1 );