繁体   English   中英

在内存中生成的程序集上使用System.Addin

[英]Using System.Addin with Assembly generated in memory

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

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

除生成的程序集在应用程序的整个生命周期中不断累积的事实外,此方法都可以正常工作。 当我所有的都是客户端应用程序时,这是可以的,但是现在我正在迁移到基于服务器的应用程序中,并且我不想不时地重置服务。

在搜索如何卸载程序集时,我发现了System.Addin命名空间。 它恰好实现了我想要的功能:将程序集加载到另一个AppDomain上,我可以将其丢弃。 它甚至封装了所有反射。

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

最好的问候,卡洛斯

我不明白您正在使用AddInStore(卸载程序集吗?),但是您只能卸载appdomain(您说能够在其中创建动态加载的程序集):

            AppDomain.Unload(yourAppDomain);

也许您正面临更大的问题!

也许DynamicMethod是您要找的东西。

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

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

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

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

在那时,我正在研究基于MAF的应用程序,其中包括现场编译C#代码(使用System.CodeDom)。 它与您的相似,但就我而言,编译仅在升级后进行。 因此,加载许多“脚本”程序集都没有问题。 另外,我在文件系统上构建程序集。

祝您好运,

Panos

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM