c# - 在 .NET 4 中编译 .NET 代码?

标签 c# .net compilation

我记得当 .NET 4 处于测试阶段时,有一个开发人员制作了一个命令行应用程序的视频,他可以在其中键入 C# 代码并即时编译代码。当时的想法是编译器现在可以在 .NET 语言中使用。

有人记得这是哪里吗?我需要用一种小型宏语言创建一个应用程序,我很想使用 C# 作为那种宏语言,但我不知道在哪里可以找到这个库..

最佳答案

您可以使用 CSharpCodeProvider class在运行时编译程序集。

您需要制作样板模板以将宏命令包装在类的静态方法中。

例如:

static readonly Assembly[] References = new[] { typeof(Enumerable).Assembly, typeof(Component).Assembly };
public Action CompileMacro(string source) {
    var options = new CompilerParameters(References.Select(a => a.Location).ToArray()) {
        GenerateInMemory = true
    };
    string fullSource = @"public static class MacroHolder { public static void Execute() { \r\n" + source + "\r\n} }";
    try {
        var compiler = new CSharpCodeProvider(new Dictionary<string, string> { { "CompilerVersion", "v4.0" } });

        var results = compiler.CompileAssemblyFromSource(options, fullSource);

        if (results.Errors.Count > 0)
            throw new InvalidOperationException(String.Join(
                Environment.NewLine, 
                results.Errors.Cast<CompilerError>().Select(ce => ce.ErrorText)
            ));

        return (Action)Delegate.CreateDelegate(
            typeof(Action),
            results.CompiledAssembly.GetType("MacroHolder").GetMethod("Execute")
        );
    } finally { options.TempFiles.Delete(); }
}

关于c# - 在 .NET 4 中编译 .NET 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3111190/

相关文章:

c# - 在多个数组列表中,我想重命名重复值

c# - 未连接控制台时,Console.WriteLine 是否会在 WinForms 应用程序中占用任何时间?

.net - 我可以从 .NET 运行 DBCC CHECKDB 吗?

c - Makefile:没有链接问题的编译

compilation - 无论如何如何调用 librsync?

c# - 有什么方法可以将复选框列表绑定(bind)到 asp.net mvc 中的模型

c# - 我加入 .NetCore 3.1 引发有关 NavigationExpandingExpressionVisitor 的异常,那是什么?

c# - 自定义引用循环处理

.net - 寻找一个锁定的脚本解释器

android - 结合使用jeremyfeinstein.slidingmenu和ActionBarSherlock可以将 “AAPT: error: duplicate value for resource ' attr/background'与 ''配置一起使用。”