【问题标题】:Is there a way I can parse/run C# within an application, almost like a script?有没有一种方法可以在应用程序中解析/运行 C#,就像脚本一样?
【发布时间】:2012-01-09 12:19:39
【问题描述】:

我目前正在编写一些代码,我想知道是否可以从我的应用程序中执行一些 C# 代码。我会给你一个想法,假设我想给用户一个文本框并让他们输入一些代码并点击 go,我希望他们询问水果列表,然后遍历每个水果并输出它..示例:

var fruitList = getFruit();
foreach(var fruit in fruitList)
{
   print(fruit.Name);
}

我希望能够通过这个并将 Fruit 对象列表分配给fruitList,解析器应该能够将 getFruit() 绑定到我用 c# 代码编写的方法。打印也是如此,它应该等同于我编写的将其输出到文本框的打印函数。

现在我知道 C# 不是脚本,它是经过编译的,而且我在 Google 上进行了很多搜索,但实际上找不到任何东西。对我来说,我唯一的选择似乎是自己编写一个小语言解析器——这听起来很有趣——但我以前做过,我知道这很辛苦。所以这只是一个初步检查,看看在我长期承诺之前是否确实存在一些解决方案。

那么,我的程序员伙伴们,你们知道什么可以帮助我吗?

如果不是,没问题,我感谢所有反馈,无论是提示、建议、文章链接(如 http://blogs.msdn.com/b/ericwhite/archive/2010/06/29/writing-a-recursive-descent-parser-using-c-and-linq.aspx 或解决方案)。

问候,
亚当

编辑:我设法得到了一个工作示例。请注意,此代码有点混乱,因为我已将一些其他代码粘贴到测试应用程序中,但它可以工作。基本上,我将代码编译成 DLL,然后加载 DLL、查找类型、查找方法并调用它。这也太他妈快了吧!我不想向您发送垃圾邮件,因此完整代码如下:

http://imdsm.blogspot.com/2012/01/compile-c-into-assembly-then-load-it.html

感谢所有在这里发帖的人。你让我免了几天的困惑!

【问题讨论】:

    标签: c# parsing


    【解决方案1】:

    你的意思是像这个截图here

    我们在我们的软件HeuristicLab 中使用它,您可以将 ProgrammableOperator 添加到运算符图中,该运算符将执行您在自定义算法中键入的位置键入的代码。

    System.CodeDom 命名空间中,您拥有动态编译代码所需的一切。您可以从编译中创建程序集,获取程序集的类型并执行它们的代码。

    【讨论】:

      【解决方案2】:

      我认为 microsoft 的新编译器项目正是您所寻找的。有了它,您可以像运行脚本一样运行 C#。

      Project "Roslyn"

      【讨论】:

      • 谢谢,我现在看看。干杯
      • 顺便欢迎来到stackoverflow!如果你喜欢一个答案,你可以投票给这个人信用(声誉)。如果它是您问题的答案,您也可以接受它作为答案,让其他人知道这是正确的答案,并给予给出答案的人声誉。
      • 感谢@SynerCoder,多年来我一直是个潜伏者,stackoverflow 救了我很多次,我已经记不清了。与所有事情一样,轮到我加入社区并添加内容了。感谢您的欢迎!
      • 您可以在 Roslyn 编译器中使用宿主代码。 msdn.microsoft.com/en-us/hh543925 据我所知,您可以为您的主机代码创建自己的脚本 API。但就像@munissor 所说.. 它仍然是 CTP 状态
      【解决方案3】:

      看看Roslyn是否有帮助,它仍处于CTP状态。

      【讨论】:

      • 谢谢,我在某处的列表底部看到了这个,但不确定是否适合做这项工作。我去看看是不是。
      • @AdamKDean:Roslyn 将能够帮助处理 C# 和 VB 脚本场景,但它还没有真正准备好迎接黄金时段。比尔于 10 月在此处发布了一些关于我们计划的初步文件:social.msdn.microsoft.com/Forums/en-US/roslyn/thread/…。如果您想对其进行评估并就您在该领域面临的各种问题向我们提供反馈,请随时在 Bi​​ll 的帖子中留下反馈。谢谢!
      • @EricLippert 来宾代码(可编辑)需要能够从主机代码调用方法/访问变量,并且像它自己的类一样运行。是否有可能将代码编译到库中并动态加载它并调用通用方法?示例:pastebin.com/ATP6ri6R 如果我可以将代码插入到模板中,然后对其进行编译并将其转换为 Guest 对象,那就太好了。可能吗?
      • @AdamKDean:对于 Roslyn 论坛来说,这将是一个很好的问题。我不是 Roslyn 脚本 API 部分的专家。我几乎只在语义分析器上工作。
      【解决方案4】:

      您可以使用CSharpCodeProvider

      或者您可以使用脚本语言并在您的应用程序中运行解释器 前IronRuby

      【讨论】:

      • 确实很有趣 - 不完全确定这是正确的解决方案,除非我生成其余代码并将其添加到编译中 - 不过,我会担心这个的执行时间.但是感谢您的链接!
      • CSharpCodeProvider 会非常快,因为编译成本只产生一次。 A-la IronRuby 加载后也应该没问题,但它是一个完整的脚本环境 + 您可以使用这些语言获得通常的脚本运行时。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-05
      • 1970-01-01
      • 2020-06-17
      • 2018-10-08
      相关资源
      最近更新 更多