コードからコードを動的にコンパイルします。
string code = @"
namespace CodeInjection
{
public static class DynConcatenateString
{
public static string Concatenate(string s1, string s2){
return s1 + "" ! "" + s2;
}
}
}";
// http://stackoverflow.com/questions/604501/generating-dll-assembly-dynamically-at-run-time
Console.WriteLine("Now doing some injection...");
Console.WriteLine("Creating injected code in memory");
CSharpCodeProvider codeProvider = new CSharpCodeProvider();
ICodeCompiler icc = codeProvider.CreateCompiler();
CompilerParameters parameters = new CompilerParameters();
parameters.GenerateExecutable = false;
parameters.GenerateInMemory = true;
//parameters.OutputAssembly = "DynamicCode.dll"; // if specified creates the DLL
CompilerResults results = icc.CompileAssemblyFromSource(parameters, code);
次に、リフレクションを使用してメソッドを呼び出すことができます。
Console.WriteLine("Input two strings, and I will concate them with reflection:");
var s1 = Console.ReadLine();
var s2 = Console.ReadLine();
var result = (string)results.CompiledAssembly.GetType("CodeInjection.DynConcatenateString").GetMethod("Concatenate").Invoke(null, new object[] { s1, s2 });
Console.WriteLine();
Console.WriteLine("Result:");
Console.WriteLine(result);
しかし、私は次のようなものを呼び出したいと思います:
Console.WriteLine("Input two strings, and I will concate them with dynamic type:");
var s1 = Console.ReadLine();
var s2 = Console.ReadLine();
dynamic type = results.CompiledAssembly.GetType("CodeInjection.DynConcatenateString");
var resultA = (string)type.Concatenate(s1, s2); // runtime error
// OR
var resultB = (string)CodeInjection.DynConcatenateString.Concatenate(s1, s2); // compile error (cannot find assembly)
Console.WriteLine();
Console.WriteLine("Result:");
Console.WriteLine(resultA);
Console.WriteLine(resultB);
結果Bの方が良いでしょう。それを行う方法はありますか?厳密には .NET 4.0 が必要です。まだ 4.5 に更新していません (チームの半数が VS 2010 を使用しているため)。(リフレクションで呼び出すことができます。dyn.コードをテストする必要があるため、別の方法を探しているだけです)