【发布时间】:2025-12-26 19:25:12
【问题描述】:
我有一个包含按钮的 WPF C# 应用程序。
按钮单击的代码写在单独的文本文件中,该文件将放置在应用程序运行时目录中。
我想在单击按钮时执行放置在文本文件中的代码。
知道怎么做吗?
【问题讨论】:
标签: c# .net runtime csharpcodeprovider
我有一个包含按钮的 WPF C# 应用程序。
按钮单击的代码写在单独的文本文件中,该文件将放置在应用程序运行时目录中。
我想在单击按钮时执行放置在文本文件中的代码。
知道怎么做吗?
【问题讨论】:
标签: c# .net runtime csharpcodeprovider
执行编译的即时类方法的代码示例:
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);
}
}
}
【讨论】:
您可以使用Microsoft.CSharp.CSharpCodeProvider 即时编译代码。具体见CompileAssemblyFromFile。
【讨论】:
我建议查看Microsoft Roslyn,特别是它的ScriptEngine 类。
以下是一些很好的例子:
使用示例:
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);
【讨论】:
Install-Package Roslyn
看起来有人为此创建了一个名为 C# Eval 的库。
编辑:更新了指向 Archive.org 的链接,因为 original site 似乎已死。
【讨论】:
有几个示例可以了解它是如何工作的。
1 http://www.codeproject.com/Articles/12499/Run-Time-Code-Generation-I-Compile-C-Code-using-Mi
这个例子的重点是你实际上可以做所有事情。
myCompilerParameters.GenerateExecutable = false;
myCompilerParameters.GenerateInMemory = false;
2http://www.codeproject.com/Articles/10324/Compiling-code-during-runtime
这个例子很好,因为你可以创建 dll 文件,所以它可以在其他应用程序之间共享。
基本上你可以搜索http://www.codeproject.com/search.aspx?q=csharpcodeprovider&x=0&y=0&sbo=kw&pgnum=6并获得更多有用的链接。
【讨论】: