【问题标题】:Using System.Addin with Assembly generated in memory使用 System.Addin 和在内存中生成的程序集
【发布时间】:2012-02-06 05:49:21
【问题描述】:

我有一个应用程序,我必须在其中向用户提供即时可扩展性。您可以将其视为一种计算引擎,具有大量数据和一些数学/数值算法。我提供了一些静态字段(数据)和方法(计算),用户可以使用它们构建一个应该返回双精度的有效 C# 表达式。

用户在文本框中键入有效表达式,我应该提供结果。我目前所做的是,按照http://blogs.msdn.com/b/abhinaba/archive/2006/02/09/528416.aspx 中的步骤,将表达式注入到内存中生成的程序集的静态方法上。然后我使用反射来调用具体的方法并返回结果。

这很好用,除了生成的程序集在应用程序的生命周期中不断累积。当我只有客户端应用程序时,这没问题,但现在我正在转向基于服务器的应用程序,我不想不时重置服务。

在搜索如何卸载程序集时,我发现了 System.Addin 命名空间。它完全符合我的要求:在不同的 AppDomain 上加载程序集,我可以在后面丢弃它。它甚至封装了所有的反射。

我现在唯一的问题是 AddInStore 需要一个文件路径,但我的所有程序集都是在内存中生成的,方法是将 CompileParameters 的 GenerateInMemory 属性设置为 true。绝对有必要将我的程序集写入磁盘吗?或者是否可以将运行时编译的程序集直接用作插件?

最好的问候, 卡洛斯

【问题讨论】:

    标签: .net reflection dynamic add-in maf


    【解决方案1】:

    我不明白您使用 AddInStore 做什么(卸载程序集?),但您可以卸载 appdomain(您说您可以在其中创建动态加载的程序集):

                AppDomain.Unload(yourAppDomain);
    

    或者您可能面临更大的问题!

    【讨论】:

      【解决方案2】:

      也许DynamicMethod 就是您要找的。​​p>

      如果没有,那么您可以查看IronPython。它很容易添加到您的应用程序中,也非常强大。当然这会比编译的 C# 代码慢,但我不确定它是否会比编译+反射慢。

      当然你可以做 MZN 提到的事情。你可以:

      1. 将编译器类更改为从 MarshalByRefObj 派生。这是 CLR 创建代理对象所必需的。您将不得不检查一下 .Net Remoting。不过也不算多。
      2. 创建自己的 AppDomain,
      3. 最后调用 CreateInstanceFromAndUnwrap 的重载之一,在新的 AppDomain 上使用编译器类加载程序集,并在其上创建编译器的实例。它会将代理对象返回给您。然后使用代理对象进行实际编译。编译的程序集将加载到新的 AppDomain 上。当您决定不再需要此程序集或已达到最大编译程序集数时,您可以进行 MZN 提到的调用并卸载 AppDomain 和所有已加载的程序集。然后从新的 AppDomain 再次重复整个过程。

      我认为最简单的方法是使用 IronPython。

      目前,我正在开发一个基于 MAF 的应用程序,其中包括现场编译 C# 代码(使用 System.CodeDom)。它与您的相似,但在我的情况下,编译仅在升级后进行。所以我没有加载许多“脚本”程序集的问题。我还在文件系统上构建程序集。

      祝你好运,

      帕诺斯

      【讨论】:

        猜你喜欢
        • 2016-04-22
        • 2018-01-12
        • 2010-10-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-18
        相关资源
        最近更新 更多