C# 在.NET4中编译.NET代码?

C# 在.NET4中编译.NET代码?,c#,.net,compilation,C#,.net,Compilation,我记得.NET4在beta版时有一段视频,一位开发人员制作了一个命令行应用程序,他可以在其中键入C代码,然后它可以动态编译代码。当时的想法是编译器现在可以在.NET语言中使用 有人记得这是什么地方吗?我需要用一种小的宏语言创建一个应用程序,我很想用C作为宏语言,但我不知道在哪里可以找到这个库。不确定您所指的库在哪里,但您所说的是一个交互式Shell 我记得唯一看到的是Mono团队发布的。CSharpRepl还包含Mono团队开发的编译器即服务功能。您可以使用在运行时编译程序集 您需要制作一个样板

我记得.NET4在beta版时有一段视频,一位开发人员制作了一个命令行应用程序,他可以在其中键入C代码,然后它可以动态编译代码。当时的想法是编译器现在可以在.NET语言中使用


有人记得这是什么地方吗?我需要用一种小的宏语言创建一个应用程序,我很想用C作为宏语言,但我不知道在哪里可以找到这个库。

不确定您所指的库在哪里,但您所说的是一个交互式Shell

我记得唯一看到的是Mono团队发布的。CSharpRepl还包含Mono团队开发的编译器即服务功能。

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

您需要制作一个样板模板,将宏命令封装在类中的静态方法中

例如:

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文件。

如果您愿意接受其他建议,您现在可以使用Python或F或Boo作为宏语言

我自己更喜欢Python;它是设计最好的语言之一。C在其后期开发中大量借鉴了Python的迭代器块lambdas等


曼宁出版公司有一本书叫;第15章介绍了在其他程序中使用IronPython作为脚本引擎或插件。

我不会使用Python,它没有.NET基础设施,因此您受到限制


F是惊人的。

编译器即服务功能已经存在了相当长的一段时间,有迹象表明它可能出现在.NET 5或6中,但在.NET 4中不可用

如果您确实需要在.NET上运行,请注意,Mono在Windows上运行得很好,所以运行Mono实际上不会丢失任何东西,一个有趣的选择可能是研究将Mono.CSharp移植到.NET有多困难。我的意思是,最终,在某一点上,它生成的CIL字节码在所有CLI实现中都是完全相同的,无论是Mono、.NET、DotGNU、Rotor、Bartok还是其他什么

否则,您的选项与以前几乎相同:生成文件并调用命令行编译器、使用DLR树、使用轻量级代码生成、使用反射、发射、使用CodeDOM、使用CSharpCodeProvider、创建您自己的脚本语言、托管其他脚本语言或托管DLR


我可能会选择后者:托管DLR是绝对容易的,它让您可以访问Ruby、Python、ECMAScript和Scheme等多种优秀的脚本语言,实际上用户可以使用他们在机器上安装的任何DLR语言。

这是目前唯一可用的答案。您所指的视频演示的是编译器即服务,它暂定用于C 5。另请参见:您所说的没有.NET基础设施是什么意思?IronPython是一种一流的.NET语言。