从代码文件在运行时执行C#代码

我有一个包含一个button的WPF C#应用程序。

单击button的代码将写入单独的文本文件,该文件将放置在应用程序运行时目录中。

我想要执行那个放在文本文件中的代码点击button。

任何想法如何做到这一点?

您可以使用Microsoft.CSharp.CSharpCodeProvider即时编译代码。 具体来说,请参阅CompileAssemblyFromFile 。

用于执行编译的类代码示例:

 using System; using System.Collections.Generic; using System.Text; using System.Diagnostics; using System.IO; using System.Reflection; using System.Net; using Microsoft.CSharp; using System.CodeDom.Compiler; namespace ConsoleApplication2 { class Program { static void Main(string[] args) { string source = @" namespace Foo { public class Bar { public void SayHello() { System.Console.WriteLine(""Hello World""); } } } "; Dictionary<string, string> providerOptions = new Dictionary<string, string> { {"CompilerVersion", "v3.5"} }; CSharpCodeProvider provider = new CSharpCodeProvider(providerOptions); CompilerParameters compilerParams = new CompilerParameters {GenerateInMemory = true, GenerateExecutable = false}; CompilerResults results = provider.CompileAssemblyFromSource(compilerParams, source); if (results.Errors.Count != 0) throw new Exception("Mission failed!"); object o = results.CompiledAssembly.CreateInstance("Foo.Bar"); MethodInfo mi = o.GetType().GetMethod("SayHello"); mi.Invoke(o, null); } } } 

我build议看看Microsoft Roslyn ,特别是ScriptEngine类。 以下是一些很好的例子:

  1. Roslyn脚本API简介
  2. 使用Roslyn ScriptEngine为ValueConverter处理用户input 。

用法示例:

 var session = Session.Create(); var engine = new ScriptEngine(); engine.Execute("using System;", session); engine.Execute("double Sin(double d) { return Math.Sin(d); }", session); engine.Execute("MessageBox.Show(Sin(1.0));", session); 

看起来像有人创build了一个名为C#Eval的库

你需要的是一个CSharpCodeProvider类

有几个样本来了解它是如何工作的。

1 http://www.codeproject.com/Articles/12499/Run-Time-Code-Generation-I-Compile-C-Code-using-Mi

这个例子的重要之处在于,事实上你可以做所有的事情。

 myCompilerParameters.GenerateExecutable = false; myCompilerParameters.GenerateInMemory = false; 

2 http://www.codeproject.com/Articles/10324/Compiling-code-during-runtime

这个例子是很好的因为你可以创builddll文件,所以它可以在其他应用程序之间共享。

基本上你可以searchhttp://www.codeproject.com/search.aspx?q=csharpcodeprovider&x=0&y=0&sbo=kw&pgnum=6并获得更多有用的链接。