【问题标题】:How to manage creating/compiling dynamic objects in .net 4.0如何在 .net 4.0 中管理创建/编译动态对象
【发布时间】:2011-03-31 05:48:21
【问题描述】:

我正在编写一个应用程序,它允许用户创建自定义算法来计算对象集合上的值。简而言之,我将使用一种方法获得一个带有类源代码的字符串。

我实现的解决方案是为每个此类自定义算法在单独的 dll 中编译字符串源代码,然后使用 Assembly.Load 加载它们并实例化保存在 dll 中的类。从可维护性的角度来看,这意味着我必须将源代码存储在数据库中(例如)并管理已编译 dll 的存在(如果丢失,则通过重新编译源代码来重新创建)

考虑到 .Net 4.0 的新功能,有没有更好的方法来做到这一点?

编辑: 输入源代码是 C#,我正在使用 CSharpCodeProvider 来编译代码。自定义类都是从基类派生的,它们覆盖了实际保存计算逻辑的方法。我真正想做的是摆脱 dll 管理,并且在每次我的应用程序启动时编译所有类时不会损失(太多)性能

【问题讨论】:

    标签: c# .net dynamic


    【解决方案1】:

    我会研究脚本语言; IronPython 易于嵌入,或者有用于 .NET 的 JavaScript 引擎。简单,通常足够快。


    如果(cmets)你需要使用c#,我会:

    • 所有当前方法同时构建到一个程序集中;解决了很多问题
    • 如果数据在执行过程中发生变化,请使用 AppDomains 以便我可以卸载它们

    我在模型/规则是 XML 的情况下做了类似的事情,通过转换运行它以获取 c#,并使用 CSharpCodeProvider(或其他)进行编译;并且只需每分钟左右轮询一次以查看是否需要新版本

    【讨论】:

    • 要求用户提供的源代码是C#。
    • 而且我认为您可以直接编译成内存程序集。所以你不需要在磁盘上管理它们。
    • @CodeInChaos。是的,我可以在内存中编译,但每次应用程序启动时我都必须这样做,对于我的所有课程。我没有做性能测试来确切了解这将花费多少时间,但是当有很多自定义代码时,每次都编译可能无法接受
    • @anchandra 在我的案例中我所做的是将编译后的 dll 保存到存储中,并将(发布/订阅)分发到所有服务器,IIRC
    • 你真的有那么多代码要在运行时编译吗?编译器相对较快。我会在启动时将您想要的所有类编译成一个 dll,并且只有在实践中变得太慢时才查看 dll 管理。我的直觉是它足够快。
    【解决方案2】:

    CSharpCodeProvider 已经存在了一段时间,应该符合要求。它可以用来生成单独的库,就像你一直在做的那样(也许你正在使用 CSharpCodeProvider),但它也可以用来生成动态类对象。如果它们都实现了一个接口,您可以将对象转换为接口,或者您可以使用反射来调用您的逻辑。这是实现类似的代码项目文章:

    http://www.codeproject.com/KB/dotnet/dynacodgen.aspx

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-10
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多