2012-03-03 37 views
0

我正在C#3.5 winforms项目上工作。如何动态执行c#代码

我想动态地执行一些代码,这是一个字符串变量。 的代码,我想执行是这样的:

(GetSetting("MYSETT1") == 1? "OK" : "Cancel") 

我想用它在我的项目中存在的方法和使用他们,我想执行一些任务。

动态可能吗?

+2

让它的方法,并调用它。这里动态是什么? – 2012-03-03 10:54:09

+0

就像这样的代码我有数以百计的命令,所以要做很多方法,这不是一个很好的解决方案。 – 2012-03-03 10:57:08

+1

对于动态代码生成中,可以使用[CodeDOM的](http://msdn.microsoft.com/en-us/library/y2k85ax6.aspx)或[的Emit](http://msdn.microsoft.com/en-我们/库/ system.reflection.emit.ilgenerator.emit%28V = vs.71%29.aspx)或...但是,对于你的情况,我认为这只是一个配置设置,您可以使用XML和一些处理它代码,如果您提供有关您的问题的更多详细信息,我们可以帮助您更好。 – 2012-03-03 11:06:19

回答

1

可以动态编译代码并执行。

此链接可能会有所帮助:

Using the CodeDOM

Dynamically executing code in .Net

+0

我如何使用这个动态代码在我的项目中的方法? – 2012-03-03 11:53:36

+0

我已经找到了我的解决方案:在CodeDOM中。 在我的项目中执行类中的方法,我不得不添加该程序集。 – 2012-03-03 13:02:42

0

Mono团队能够通过

http://www.mono-project.com/CsharpRepl

如果你想使用微软的产品,你将不得不等待罗斯林,

http://visualstudiomagazine.com/articles/2011/11/16/the-roslyn-scripting-api.aspx

+0

不管是新的还是闪亮的,都会抹去以前的所有记忆。 – 2012-03-03 11:11:02

+0

您应该说任何来自Microsoft的内容都会清除所有内存中的免费和开放源代码。这是NAnt/NDoc/NUnit/NHibernate ...(一个很长的列表),但现在我们从微软得到的是非常有限的。 – 2012-03-03 12:06:39

1

如果后一个是“纯粹的”微软解决方案,你应该检查出Roslyn,一旦它出货。但在此之前,您可能需要查看CodePlex上的Fast Lightweight Expression Evaluator项目:

Flee是.NET框架的表达式解析器和评估程序。它允许您在运行时计算字符串表达式的值,例如sqrt(a^2 + b^2)。它使用自定义编译器,强类型表达式语言和轻量级代码编译器直接向IL编译表达式。这意味着表达评估非常快速和高效。试用演示,它可以让你根据表达式生成图像,并亲自查看。

如果这不符合你的账单,你应该检查下我自己的项目无耻的自我推销。

ExpressionEvaluator

的ExpressionEvaluator是一个库,以帮助开发人员评估C#和VB .NET表达式。您需要评估的表达式通过.NET Framework自己的CodeDOM进行编译,因此几乎支持所有语言功能。该库可以将远程对象暴露给表达式以实现类似脚本的功能。所有的表情评估都是沙盒。

static void Main(string[] args) 
{ 
    var expressions = new List<string> 
          { 
           "3 * 5", 
           "Log10(50)", 
           "Parameters!Greeting + \" World!\"" 
          }; 

    // An ExpressionMeta contains the expressions and extensions to be compiled. 
    var meta = new ExpressionMeta("VisualBasic"); 

    // Add the expressions to be compiled. 
    foreach(var expression in expressions) 
     meta.AddExpression(expression); 

    // Add the extensions to be compiled. 
    var extension = new Dictionary<string, string> {{"Greeting", "Hello"}}; 
    meta.AddExtensionIgnoreAssembly(new Extension("Parameters", extension)); 

    // Compile the expressions 
    using(var evaluator = meta.Compile()) 
    { 
     // Evaluate the expression 
     foreach(var expression in expressions) 
      Console.WriteLine("{0}", evaluator.Evaluate(expression)); 
    } 
} 

输出

15 
1.69897000433602 
Hello World!