[英]Compiling .NET code in .NET 4?
我记得当.NET 4处于测试版时,有一个开发人员的视频制作了一个命令行应用程序,他可以输入C#代码,它会动态编译代码。 我们的想法是编译器现在可以在.NET语言中使用。
有谁记得这是什么? 我需要用一个小的宏语言创建一个应用程序,我很乐意使用C#作为那种宏语言,但我不知道在哪里找到这个库..
您可以使用CSharpCodeProvider
类在运行时编译程序集。
您需要创建一个样板模板,将宏命令包装在类中的静态方法中。
例如:
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(); }
}
不确定你所指的那个在哪里,但你所说的是一个Interactive Shell。
我记得唯一看到的是由Mono团队发布的CSharpRepl 。 CSharpRepl还包含Mono团队开发的“编译器即服务”功能。
您可以尝试使用CS-Script作为替代方案 - 允许您运行单独的C#文件,就像它们是脚本文件一样。
如果您对其他建议持开放态度,可以使用Python或F#或Boo作为宏语言。
我更喜欢Python,我自己; 它是设计最好的语言之一。 C#在后来的开发中借用了Python(迭代器块,lambdas,......)。
Manning Publications有一本名为IronPython in Action的书; 第15章是关于在其他程序中使用IronPython(作为脚本引擎或插件)。
也许你的意思是CodePad.NET ? 好吧,它不是一个命令行应用程序,但它是开源的,可能会指向正确的方向。
我不会去Python,它没有.NET基础设施,因此你是有限的。
F#太神奇了。
编译器即服务功能已经在Mono中提供了很长一段时间,并且有迹象表明它可能出现在.NET 5或6中,但它在.NET 4中不可用。
如果你绝对肯定需要在.NET上运行(注意Mono在Windows上运行得很好,所以你实际上没有通过运行Mono失去任何东西),一个有趣的选择可能是调查移植Mono.CSharp
有多难Mono.CSharp
到.NET。 我的意思是,最终,在某些时候,它生成的CIL字节码在所有CLI实现中都是完全相同的,无论是Mono,.NET,DotGNU,Rotor,Bartok还是其他什么。
否则,您的选项与以往几乎相同:生成文件并调用命令行编译器,使用DLR树,使用轻量级代码生成,使用Reflection.Emit
,使用CodeDOM,使用CSharpCodeProvider
,创建自己的脚本语言,托管一些其他脚本语言或托管DLR。
我可能会选择后者:托管DLR非常简单,它不仅可以访问一种而且可以访问几种优秀的脚本语言(目前是Ruby,Python,ECMAScript和Scheme),实际上用户可以使用任何 DLR他们在自己的机器上安装的语言。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.