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