cadencii_jp @ wiki

メモ


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

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[] {} );
parameters.GenerateInMemory = true;
string code = "";
code += "namespace a{";
code += "    public class foo{";
code += "        public static int bar( int value ){";
code += "            return value * 10;";
code += "        }";
code += "    }";
code += "}";
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 td = (TestDelegate)Delegate.CreateDelegate( typeof( TestDelegate ), mi );
Console.WriteLine( "td.Invoke( 1 )=" + td.Invoke( 1 );