【问题标题】:Program code as a string程序代码作为字符串
【发布时间】:2011-07-06 02:12:09
【问题描述】:

这并不是真正的实际用途,但是有没有什么办法可以在C#中将字符串作为程序代码执行?

例如:
而不是写

Console.WriteLine("blah blah blah");

我想写一些类似的东西

string s = "Console.WriteLine(\"blah blah blah\")"
execute(s);

【问题讨论】:

标签: c#


【解决方案1】:

我能想到的唯一方法是在运行时编译您的代码。这是一篇解释如何做到这一点的文章http://simeonpilgrim.com/blog/2007/12/04/compiling-and-running-code-at-runtime/

【讨论】:

    【解决方案2】:

    我知道这并不完全符合您的要求(尽管您没有在字符串中提及程序的语言),但 IronPython 非常酷:http://secretgeek.net/host_ironpython.asphttp://blogs.msdn.com/b/abhinaba/archive/2006/02/09/528416.aspx

    另外(正如 boca 已经提到的)运行时编译也运行良好:Is it possible to dynamically compile and execute C# code fragments?

    【讨论】:

      【解决方案3】:

      这在 C# 中可能,但故意困难。没有简单的“exec()”函数可以开箱即用。

      AFAIK 这是设计。 Exec 函数是巨大的安全漏洞,因为它们将语言的全部功能暴露给通常不应该拥有这种功能的用户。作为程序员,您经常打算使用 exec() 函数来允许用户输入简单的数学或字符串表达式,突然间,您遇到了一个黑客并实例化了一个 System.Net.WebClient 并使用它来下载和执行某些东西恶意得多。无法限制允许的程序集。

      .Net 语言中的首选替代方法是 Domain Specific Language (DSL)。 DSL 是一种(相对)简单的方法,可以定义您自己的语法(及其背后的含义),以允许用户执行哪些类型的操作,而无需让他们访问整个基类库的安全隐患。它还具有允许您提供更高级别的专业化操作的优势。

      【讨论】:

        【解决方案4】:

        这可以使用Microsoft.CSharp.CSharpCodeProvider 来完成。

        检查this

        【讨论】:

          【解决方案5】:

          您可以使用 CodeDOM 做到这一点。请参阅 MSDN 上的 Using the CodeDOM

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-11-07
            • 1970-01-01
            相关资源
            最近更新 更多