在这种情况下,我应该在运行时编译c#吗?

本文关键字:编译 运行时 这种情况下 我应该 | 更新日期: 2023-09-27 18:03:14

我们有一个MS SQL 2005数据库。数据是从Excel表格上传到这个数据库的。这些Excel表格来自不同的供应商,其中大多数都没有维护一个预定义的结构,所以我们可以创建一个单独的插入/更新模块。到目前为止,我已经创建了一个模块,它接受一个预定义格式的Excel表,并从它上传数据。对于每个供应商来说,都必须有人以预定义的方式手动格式化它,这需要很长时间,而且是一项繁琐的工作。

现在我们已经删除了手动格式化,并将所有数据库列放在一列中,并将包含所有Excel列的下拉列表放在另一列中。用户映射所需的列并更新数据库。

但是大多数时候这种简单的映射是不够的,因为大多数情况下我们必须根据一些逻辑拆分/组合值。为了让它对用户更友好,而且因为我的大多数用户本身就是c#程序员,我决定删除下拉框,使用文本框,用户可以直接输入逻辑。例如:

dbcol1 = excel[col1].ToString().Replace("-"," ")
    +(int.Parse( excel[col6].ToString())*.1).ToString();

在搜索这个时,我遇到了动态编译c#代码。因为我以前从来没有这样做过,我也不确定这种方法是否有效,我需要知道我是否在正确的方向上移动。或者有没有更有效、更快捷的方法来做到这一点?

在这种情况下,我应该在运行时编译c#吗?

编写脚本?如果你想快速编译和运行代码,c#脚本是非常方便的;

如果你可以字符串格式的东西是正确的c#,它会让你编译和运行它。

http://www.csscript.net/

例如:

dynamic script = CSScript.Evaluator
                         .LoadMethod(@"void SayHello(string greeting)
                                       {
                                           Console.WriteLine(greeting);
                                       }");
script.SayHello("Hello World!");

可能不适合制作,但你至少可以原型化你的想法

通常您会使用Reflection.Emit动态生成. net程序集并执行该程序集。然而,它只接受中间语言指令,不接受c#指令。每次你想要执行一段代码时,创建一个全新的程序集是非常低效的。


Roslyn是微软试图将编译器作为服务。这是一个新的c#和VB编译器。Net,它可以被应用程序调用来编译代码,并提供有关它正在编译的代码的信息。

Anders Hejlsberg(我相信)展示了一个使用Roslyn编译器实现c#脚本接口的例子:输入一些c#,它就会被执行。虽然Roslyn仍在开发中,但您可能想通过尝试Roslyn CTP来看看它是否满足您的需求。

c#作为脚本语言在你的。net应用程序中使用Roslyn是一篇CodeProject文章,详细介绍了一些。


最后,如果你不能(还)或者不想使用Roslyn,或者如果它不能提供你想要的执行速度,那么我认为你最好的选择(就性能而言)是自己解析和解释脚本代码。然而,这是一项容易出错的艰苦工作。