【问题标题】:Remote Executing Code - Lambdas...Static Methods....etc. eval() for C#?远程执行代码 - Lambdas...静态方法...等。 C# 的 eval()?
【发布时间】:2010-01-15 19:01:20
【问题描述】:

所以这是概念。我正在尝试为 CouchDB 编写一个 C# 后端(继续阅读,这与 CouchDB 几乎没有关系)。

这是基本的想法:

1) DB Driver 将任意字符串上传到 DB Server。

2) DB Driver 告诉 DB 服务器运行代码并生成视图

3) 数据库服务器加载我的 C# 后端,将输入字符串交给它

4) DB Server 将函数交给 C# 后端

5) DB Server 将 C# 后端数据交给执行函数

6) C# Backend 执行代码并将结果数据发送到 DB Server

7) DB Server 存储,或以其他方式排序并将结果发送回 DB Driver

所以我遇到的问题是远程代码执行。我所有的模型都是 C# 对象。所以如果能够在前端编写代码,并将代码传输到后端执行,那就太好了。无需复制 DLL 等。目前在 CouchDB 中,这种查询语言是 JavaScript,因此只需将代码复制到字符串中就非常简单。

C# 中有这样的选项吗?我可以获得函数的字符串版本吗?我是否应该创建一个外部服务器来托管这些 DLL 程序集并将它们提供给 CouchDB 后端?我应该在前端编译它们,并将 .cs 文件作为资源嵌入吗?在这一点上,我只是在头脑风暴。欢迎任何想法/想法/问题。

【问题讨论】:

    标签: c# rpc


    【解决方案1】:

    您能否使用表达式树 (System.Linq.Expressions) 来实现这一点?

    也许有一些方法可以将序列化的表达式树传递到后端,在服务器端将其编译成 lambda/Func 然后执行它?

    除了 Linq 推出时的一些好奇心研究之外,没有和他们一起玩过,但它可能会有所帮助。

    【讨论】:

      【解决方案2】:

      听起来您正在寻找的是 C# 的 Javascript 样式 eval 方法。不幸的是,这在今天并不存在,而且实施起来也并非易事。动态执行 C# 代码的两种主要方法是

      1. 通过 Reflection.Emit 构建轻量级方法
      2. 即时编译程序集(通过 CodeDom 或直接调用 csc)。

      这里要考虑的另一个选择是利用动态语言。从 C# 4.0 开始,与动态语言进行互操作非常容易。与其传递 C# 代码,不如传递 Python 或 Ruby 并利用 DLR 来代替后端?

      【讨论】:

      • 我放弃 JavaScript 的普通 CouchDB 后端的主要原因之一是我对动态语言的普遍厌恶。 DLR 是一个有趣的选择,但我基本上又回到了编译时不捕获错误的同一条船上。
      【解决方案3】:

      定义“功能”。这是任意代码(必须动态编译和执行),还是可以附加到类的方法列表?

      如果后者(这是你应该做的 - 允许任意动态代码执行不仅违反 .NET 开发模型(在我看来 - 请不要着火),这是一个巨大的安全风险),您可以使用网络服务。

      Web 服务和 WCF 服务是在机器之间分配处理的绝佳方式。

      【讨论】:

        【解决方案4】:

        我过去使用过的几个项目可能会对您有所帮助:

        Vici Parser

        Vici Parser 是一个 .NET 库,用于 后期绑定表达式解析和 模板渲染。它还包括 一个易于使用的标记器,可以 用于解析各种文件 格式(一个功能齐全的 JSON 解析器 包括在内)。

        This Codeproject article

        这个例子展示了一个“Eval”函数 用于 C# 并实现不同的用法 这个评估函数。图书馆 是用 C# 编写的,可以测试 在解决方案中使用 MainForm。

        其他替代方法包括使用 XSLT 脚本(Umbraco CMS makes use of),也许像 LUA.NET 这样可以让您对代码可以执行的操作进行沙箱处理。

        【讨论】:

          猜你喜欢
          • 2010-11-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-29
          相关资源
          最近更新 更多