2012-01-09 38 views
3

我目前正在编写一些代码,我想知道是否可以从我的应用程序执行一些C#代码。我会给你一个想法,让我们说我想给用户一个文本框,让他们键入一些代码,然后打开,我想他们要求一个水果列表,然后通过每个水果,并输出它..一个例如:有没有办法在应用程序中解析/运行C#,就像脚本一样?

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

我希望能够通过这个和分配水果对象fruitList列表,解析器应该能够getFruit()绑到我写在C#中的方法码。打印也是如此,它应该将它等同于我写的将输出到文本框的打印函数。

现在我知道C#不是一个脚本,它被编译,我做了很多谷歌搜索,但无法找到任何东西。我唯一的选择似乎是自己编写一个小语言解析器 - 这听起来很有趣 - 但我之前完成了这个工作,而且我知道这很难。所以这只是一个初步检查,看看在我承诺长期以前是否存在某种解决方案。

所以,我的同事程序员,你知道任何可能能够帮助我吗?

如果不是,没问题,我非常感谢所有反馈,无论是提示,建议,链接到文章,如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

感谢大家谁张贴在这里。你刚刚救了我几天的困惑!

回答

3

你的意思是想在这个截图here

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

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

1

可以使用CSharpCodeProvider

或者你可以使用脚本语言和运行解释器在您的应用程序 防爆IronRuby

+0

确实很有意思 - 不完全确定它是正确的解决方案,除非可能生成剩余的代码并将其添加到编译中 - 但是,我仍然担心这个执行时间。但是,感谢您的链接! – 2012-01-09 12:39:49

+1

CSharpCodeProvider将非常​​快速,因为编译的成本只发生一次。 A-la IronRuby在加载后也应该没问题,但它是一个完整的脚本环境+您可以在这些语言中获得通常的脚本运行时。 – 2012-01-09 14:14:25

1

看一看,如果Roslyn可以帮助,但它仍然在CTP状态。

+0

谢谢,我在某处列表的底部看到了这一点,但不确定是否适合做这项工作。我会看看是否是。 – 2012-01-09 12:38:02

+1

@AdamKDean:Roslyn将能够帮助C#和VB脚本方案,但它尚未准备好黄金时段。 Bill在10月份发布了一些关于我们计划的初步文件:http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/06e3582e-386d-4a1c-964b-29529e497e72。如果你想评估它并向我们反馈你在这方面遇到的问题,请随时留下对Bill的信息的反馈意见。谢谢! – 2012-01-09 14:48:29

+0

@EricLippert客人代码(可编辑)需要能够从主机代码和函数调用方法/访问变量,就像它是自己的类一样。 如何将代码编译到库中并动态加载它并调用通用方法?例如:http://pastebin.com/ATP6ri6R 如果我可以将代码插入到模板中,然后编译它并将其转换为Guest对象,那就太棒了。 可能吗? – 2012-01-09 15:02:53

1

我认为微软的新编译器项目就是你正在寻找的东西。有了它,你可以像脚本一样运行C#。

Project "Roslyn"

+0

谢谢,我现在正在看一看。欢呼 – 2012-01-09 12:38:21

+1

并欢迎通过这种方式的计算器!如果你喜欢一个答案,你可以放弃它来给这个人信用(声誉)。如果这是你的问题的答案,你也可以接受它作为答案,让其他人知道这是正确的答案,并给予答案声望的人。 – SynerCoder 2012-01-09 14:17:24

+0

谢谢@SynerCoder,我一直是一个潜伏多年的人,stackoverflow已经挽救了我的皮肤很多次了,我已经失去了计数。就像所有的事情一样,它轮到我加入社区并添加内容。感谢您的欢迎! – 2012-01-09 15:06:42

相关问题