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

53

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

按钮单击事件的代码被编写在一个独立的文本文件中,并将放置在应用程序运行目录中。

我想要在按钮点击时执行放置在文本文件中的代码。

有什么好的方法吗?


5个回答

99

动态执行已编译类方法的代码示例:

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);
        }
    }
}

1
我已经添加了内存编译。 - acoolaum
请发布您的代码示例。我的代码不会引发文件未找到异常。 - acoolaum
我在新的控制台中执行相同的代码,没有任何更改。 - Vinod Maurya
它对我来说运行得很好。你能给我抛出异常的调用堆栈吗? - acoolaum
它在.NET 4.0客户端框架中适用于我(对于“v3.5”和“v4.0”均适用) - 我想知道,如何使用DataContext实现它?(即,我想传递的代码是“Property> = 5 && Property <10”,我要包装的方法基本上是“public object GetValue(){return”+ code +“}” - 其中“Property”是给定数据上下文中的属性... - BrainSlugs83
1
@VinodMaurya 我注意到如果编译失败,我会收到“文件未找到”的错误。在尝试调用之前,请检查results.Errors.Count的值。 - LosManos

38

23

3
在搜索下载之前,只需使用包管理器:Install-Package Roslyn - Martin Braun

3

看起来有人创建了一个名为 C# Eval 的库来实现这个功能。

编辑:由于原网站已经无法访问,因此更新链接指向Archive.org。


@RichO'Kelly,谢谢 - 我已经更新了它,指向archive.org版本。 - Aaron D

2
您需要的是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

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接