我正在制作一个遗传程序,但是我遇到了C#的局限,我想向该算法展示新功能,但是如果不重新编译该程序就无法做到。本质上,我希望程序的用户提供允许的功能,GP将自动使用它们。如果要求用户尽可能少地了解编程,那就太好了。

我想插入新功能而不将其编译到程序中。在Python中,这很容易,因为它们都是已解释的,但是我不知道如何使用C#进行操作。有人知道如何在C#中实现这一目标吗?是否有任何库,技术等?

最佳答案

这取决于您希望程序的用户“提供允许的功能”的方式。

  • 如果用户正在选择已经实现的功能,则可以将它们作为委托(delegate)或表达式树来传递。
  • 如果用户要使用C#或另一种.NET语言编写自己的方法,并将其编译为程序集,则可以使用Reflection加载它们。
  • 如果希望用户能够在程序中键入C#源代码,则可以使用CodeDom进行编译,然后使用Reflection调用生成的程序集。
  • 如果您想为用户提供自定义表达语言,例如一种简单的数学语言,然后(假设您可以解析该语言)可以使用Reflection.Emit生成动态程序集,并使用(您猜对了)Reflection进行调用。或者,您可以根据用户代码构造一个表达式树,并使用LINQ对其进行编译-取决于所需的灵活性。 (而且,如果您可以耐心等待,.NET 4.0中的表达式树将消除3.5中的许多限制,因此您可以完全避免Reflection.Emit。)
  • 如果您希望用户使用Python,Ruby或其他DLR语言输入表达式,则可以托管动态语言运行时,它将为您解释用户的代码。

  • 在这里托管DLR(以及IronPython或IronRuby)可能是一个不错的选择,因为您将获得一个经过良好测试的环境以及DLR提供的所有优化。 Here's a how-to using IronPython.

    针对您的性能问题而添加: DLR在优化方面相当明智。它不会每次都盲目地重新解释源代码:一旦将源代码(或具体而言,给定的函数或类)转换为MSIL,它将继续重用该编译表示,直到源代码发生更改(例如,函数已重新定义)。因此,如果用户继续使用相同的功能但在不同的数据集上使用,那么只要您可以保持相同的ScriptScope,就应该获得不错的性能。如果您只是担心您将要在遗传算法中无数次地运行相同的功能,则同上。托管DLR相当容易,因此,不难进行概念验证和度量以查看其是否满足您的需求。

    关于c# - C#如何创建在运行时解释的函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2458869/

    10-09 02:46