有时候做计算一些东西时候,算法一直变更,写在程序需要一直调整,因此算法写在cs文件,然后动态调用内部的方法去计算判断,只需变更cs文件即可。
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Diagnostics;
using System.IO;
using System.Reflection;
namespace ConsoleApplication
{
class Program
{
static void Main()
{
Stopwatch watch = new Stopwatch();
watch.Start();
//创建一个CSharp语言Provider
//CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CSharpCodeProvider provider = new CSharpCodeProvider();
watch.Stop();
Console.WriteLine("创建耗时:" + watch.ElapsedMilliseconds);
watch.Restart();
//设置编译时参数
CompilerParameters objCompilerParameters = new CompilerParameters();
//添加代码用到的相关引用
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
//没有Main函数就不能生成可执行文件
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;
watch.Stop();
Console.WriteLine("设置编译参数耗时:" + watch.ElapsedMilliseconds);
watch.Restart();
//编译代码
string code = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "Class1.cs");
CompilerResults cr = provider.CompileAssemblyFromSource(objCompilerParameters, code);
watch.Stop();
Console.WriteLine("编译耗时:" + watch.ElapsedMilliseconds);
if (cr.Errors.HasErrors)
{
Console.WriteLine("编译错误:");
foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
}
else
{
watch.Restart();
// 通过反射,调用HelloWorld的实例
object objHelloWorld = cr.CompiledAssembly.CreateInstance("ConsoleApplication.Class1");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("test");
Console.WriteLine(objMI.Invoke(objHelloWorld, null));
watch.Stop();
Console.WriteLine("调用耗时:" + watch.ElapsedMilliseconds);
}
Console.ReadLine();
}
}
}
被调用的cs文件内容
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
class Class1
{
//写个方法测试下动态调用的情况
public void test()
{
DateTime now = DateTime.Now;
List<string> aa = new List<string>();
aa.Add("aa");
Console.WriteLine(now);
}
}
}
参考地址:http://www.cnblogs.com/jailu/archive/2007/07/22/827058.html