using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using System.IO;
using System.Diagnostics;
namespace WindowsFormsApplication18
{
public partial class Form2 : Form
{
private BI_Log _LogEnt = new BI_Log();
public Form2()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
_LogEnt.LogType = "错误";
_LogEnt.Priority = 4;
//MessageBox.Show("确定启动吗?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
var sw = new Stopwatch();
sw.Start();
Test();
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
#region
private void Test()
{
var code = @"
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.CodeDom.Compiler;
using Microsoft.CSharp;
using System.Reflection;
using System.IO;
using WindowsFormsApplication18;
public class Abc {
public bool Get(BI_Log ent) { return ent.Priority>3; }
}
";
string exePath = Assembly.GetExecutingAssembly().Location;
string exeDir = Path.GetDirectoryName(exePath);
AssemblyName[] assemRefs = Assembly.GetExecutingAssembly().GetReferencedAssemblies();
List<string> references = new List<string>();
foreach (AssemblyName assemblyName in assemRefs)
references.Add(assemblyName.Name + ".dll");
for (int i = 0; i < references.Count; i++)
{
string localName = Path.Combine(exeDir, references[i]);
if (File.Exists(localName))
references[i] = localName;
}
references.Add(exePath);
//CompilerParameters compiler_parameters = new CompilerParameters(references.ToArray());
var options = new CompilerParameters(references.ToArray());
options.GenerateExecutable = false;
options.GenerateInMemory = true;
var provider = new CSharpCodeProvider();
var compile = provider.CompileAssemblyFromSource(options, code);
var type = compile.CompiledAssembly.GetType("Abc");
var abc = Activator.CreateInstance(type);
var method = type.GetMethod("Get");
var objs = new object[] { _LogEnt};
var result = method.Invoke(abc, objs);
Console.WriteLine(result); //输出:abc
}
#endregion
}
}