代码之家  ›  专栏  ›  技术社区  ›  Kelly

在.NET4中编译.NET代码?

  •  5
  • Kelly  · 技术社区  · 15 年前

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

    7 回复  |  直到 15 年前
        1
  •  11
  •   SLaks    15 年前

    你可以用 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(); }
    }
    
        2
  •  2
  •   Justin Niessner    15 年前

    CSharpRepl 它是由Mono团队发布的。CSharpRepl还包含Mono团队开发的编译器即服务功能。

        3
  •  1
  •   Kynth    15 年前

    你可以试试 CS-Script 另一种方法是,允许您运行单个C#文件,就像它们是脚本文件一样。

        4
  •  1
  •   Stephen Cleary    15 年前

    如果您对其他建议持开放态度,那么现在可以使用Python、F#或Boo作为宏语言。

    我更喜欢蟒蛇,我自己;它是设计最好的语言之一。C#在以后的开发中大量借鉴了Python(迭代器块、lambdas等)。

    IronPython in Action ; 第15章是关于在其他程序中使用IronPython(作为脚本引擎或插件)。

        5
  •  0
  •   Ben Voigt    15 年前

    也许你是说 CodePad.NET ? 嗯,它不是一个命令行应用程序,但它是开源的,可能会为您指明正确的方向。

        6
  •  0
  •   Turing Complete    15 年前

    真是太棒了。

        7
  •  0
  •   Community CDub    5 年前

    编译器即服务功能已被禁用 available in Mono

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

    Reflection.Emit ,使用CodeDOM,使用 CSharpCodeProvider ,创建自己的脚本语言,托管其他脚本语言或托管DLR。

    任何 他们在机器上安装的DLR语言。