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

在这种情况下,我应该在运行时编译C#吗?,c#,.net,algorithm,dynamic,C#,.net,Algorithm,Dynamic,我们有一个MS SQL 2005数据库。数据从Excel工作表上传到此数据库中。这些Excel表格来自不同的供应商,其中大多数从不维护预定义的结构,因此我们可以创建单独的插入/更新模块。 到目前为止,我已经创建了一个模块,它接受预定义格式的Excel工作表并从中上载数据。对于每个供应商来说,都必须有人手动以预定义的方式对其进行格式化,这需要花费很长时间,而且是一项愚蠢的工作 现在我们已经删除了手动格式化,将所有数据库列放在一列中,并将包含所有Excel列的下拉列表放在另一列中。用户映射所需的列并

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

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

但大多数情况下,这种简单的映射是不够的,因为大多数情况下,我们必须基于某些逻辑拆分/组合值。为了让它更方便用户,而且由于我的大多数用户本身就是C#程序员,我决定删除下拉列表,并使用用户可以输入直接逻辑的文本框。例如:

dbcol1 = excel[col1].ToString().Replace("-"," ")
    +(int.Parse( excel[col6].ToString())*.1).ToString();
在搜索时,我遇到了动态编译C#代码的情况。因为我以前从来没有这样做过,而且我也不确定这种方法是否有效,我需要知道我是否朝着正确的方向前进。或者有没有更高效、更快的方法来实现这一点?

通常您会使用动态生成.NET程序集并执行该程序集。但是,它只接受中间语言指令,不接受C#。而且,每次您想要执行一段代码时,创建一个全新的程序集是完全没有效率的


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

Anders Hejlsberg(我相信)展示了一个使用Roslyn编译器实现C#脚本接口的示例:键入一些C#,它会被动态执行。虽然Roslyn仍处于开发阶段,但您可能希望通过尝试以下方法来了解它是否能够满足您的需求

是一篇代码项目文章,详细介绍了一些内容


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

编写脚本?如果您想动态编译和运行代码,C#Script非常方便

如果你能用正确的C#字符串格式,它会让你编译并运行它

例如:

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

可能不适合生产,但您至少可以将您的想法原型化

为什么要关注效率和速度?无论你做什么,它都会非常快地获得合理的输入大小。您的输入是否太大以至于需要数小时才能处理?我认为您最好使用一些脚本语言来定义此类逻辑。是的,excel表格的大小从单个记录到数千条。确实要这样做吗?我的意思是,让用户运行任意代码是一件非常危险的事情,因为她基本上可以用服务器做任何她想做的事情。删除数据库,关闭服务器,发送垃圾邮件,谁知道呢?你是对的,但是这里所有的用户都来自我们的组织,所以没有人会通过这样做,因为他们自己都拥有所有需要的特权。是的,我遇到了这个问题,但我的问题不是如何动态编译,而是效率。在您的senario中,我的代码将为每行的每一列创建一个程序集。如果我对一个包含9000行和20列的工作表是正确的,我的代码将生成180000个程序集。不,不,只有一个程序集,并不断向其中添加用户函数。无论是类还是方法,都有一些选择器将excel行/列映射到用户函数名/上下文/等等。。。现在主要的问题是加载和卸载组件;i、 e.重新编译旧组件并用新组件替换。现在,卸载是一件痛苦的事,但它是可行的。你也可以得到一点黑客;给定现有程序集和具有新用户功能的新程序集;卸载现有部件并将两个部件编织在一起。这样可以避免重新编译现有的用户函数。