我正在制作一个基因程序,但是我在C#中遇到了一个限制,我希望在算法中提供新函数,但是如果不重新编译程序我就无法做到。本质上,我希望程序的用户提供允许的功能,GP将自动使用它们。如果用户需要尽可能少地了解编程,那就太棒了。
我想插入新功能而不将它们编译到程序中。在Python中这很容易,因为它都被解释了,但我不知道如何使用C#来做到这一点。有谁知道如何在C#中实现这一目标?有没有图书馆,技术等?
答案 0 :(得分:13)
这取决于您希望程序用户“提供允许的功能”。
托管DLR(以及IronPython或IronRuby)可能是一个不错的选择,因为您获得了经过良好测试的环境以及DLR提供的所有优化。 Here's a how-to using IronPython.
为响应您的效果问题而添加:DLR在优化方面相当聪明。它并不是每次都盲目地重新解释源代码:一旦它将源代码(或者,具体地,给定的函数或类)转换为MSIL,它将继续重用该编译的表示直到源代码改变(例如,功能被重新定义)。因此,如果用户继续使用相同的功能但使用不同的数据集,那么只要你可以保持相同的ScriptScope,你就应该获得不错的性能;如果你担心的是你将在遗传算法中运行相同的功能数千万次,那么同上。托管DLR非常容易,因此不应该很难做出概念验证并测量它是否符合您的需求。
答案 1 :(得分:7)
您可以尝试创建和操作Expression Trees。使用Linq来评估表达式树。
答案 2 :(得分:2)
您还可以使用CodeDom编译和运行函数。 当然,您可以谷歌查看一些可能符合您需求的示例。 似乎this article "How to dynamically compile C# code"和this article "Dynamically executing code in .Net" 可以帮助您。
答案 3 :(得分:1)
答案 4 :(得分:1)
您可以查看System.Reflection.Emit以在IL级别生成代码。
或生成C#,编译成库并动态加载。不太灵活。
答案 5 :(得分:1)
实际上生成IL非常容易。请参阅本教程:http://www.meta-alternative.net/calc.pdf