从代码文件在运行时执行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
类。 以下是一些很好的例子:
- Roslyn脚本API简介
- 使用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并获得更多有用的链接。