【问题标题】:Using c# to allow users to write own methods [duplicate]使用c#允许用户编写自己的方法[重复]
【发布时间】:2017-05-01 21:10:24
【问题描述】:

我有一个 C# 程序,它使用一个类中的对象,该类的方法看起来像这样:

public double TheMethod(double argument1, double argument2, ...,double argumentN)
{ 
    //method body: do something with the arguments
    //return the result
}

我想让用户能够将自己的逻辑写入方法主体,然后在程序运行时使用。

在我看来,编写脚本可能是可行的方法,但我在尝试开始时遇到了麻烦。处理这种情况的最佳方法是什么?

注意:如果重要,该程序将在更大的主桌面应用程序中运行。当应用程序已经通过某种编辑器程序运行时,我希望用户能够编写他们的代码。一旦他们启动实际使用该方法的程序,他们的代码就会被保存和使用。

【问题讨论】:

  • 已经有很多关于该主题的问题和文章 - bing.com/search?q=c%23+scripting(或您喜欢的任何其他搜索引擎,如 Yahoo、Yandex,......因为大概 Google 还不够)。 “尝试启动 {scripting} 时遇到问题”对于您在实施众多提案之一时遇到的问题的解释非常糟糕 - 如果您在设置脚本时遇到特殊问题,最好改为询问。

标签: c# scripting


【解决方案1】:

您当然可以动态编译和执行 C#。见Is it possible to dynamically compile and execute C# code fragments?

根据您的用户是谁以及他们的脚本需要如何集成到更广泛的应用程序中,IronPython 可能是一个更好的选择——本质上是在 python 中编写脚本。有关集成 C# 和 IronPython 的详细信息,请参阅https://blogs.msdn.microsoft.com/charlie/2009/10/25/running-ironpython-scripts-from-a-c-4-0-program/。

与从外部源运行任何动态注入代码一样,请考虑安全性。

【讨论】:

  • IronPython 的建议看起来很有希望。你知道这将如何影响速度吗?例如,如果我在 IronPython 中编写与源代码相同的方法体逻辑,IronPython 的实现会明显变慢吗?
  • 对于任何动态编译的代码,在编译代码时都会花费一些额外的时间,无论是对于 C# 还是 IronPython。 stackoverflow.com/questions/3081661/… 表示 IronPython 速度较慢,但​​这可能取决于具体情况。您的用户注入了多少代码?如果执行时间在 C# 中为 5 秒,在 IronPython 中为 7 秒,那么 2 秒的差异是否重要?没有上下文就很难判断。
【解决方案2】:

如果您希望您的用户使用 c# 编写,最简单的方法可能是用不同的副本换出文件(或至少是方法的主体),并在每次运行之前重新编译子应用程序。

可以在运行时实时替换方法体,但这不适合轻松愉快的人! https://msdn.microsoft.com/en-us/library/system.reflection.emit.aspx

如果您乐于创建自己的迷你脚本语言,请查看 Antlr http://www.antlr.org/

【讨论】:

  • Reflection.Emit 完全不同,对构建编译器很有用...
  • @AlexeiLevenkov 想解释一下您的陈述吗?在他的链接之后,文档中写道:“这些类的主要客户是脚本引擎和编译器。”是不是错了?
猜你喜欢
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多