我想编写一个允许用户定义GUI驱动的代码段的应用程序。
在这种情况下,我旨在将这些代码段定义发送到一个服务,该服务将能够出于多种目的对其进行编译和运行(代码dom,代码dom提供程序...)。
由于这些已编译的程序集将生成多次,因此我的问题是如何在需要时取消分配它们。
我知道从文件加载的程序集不能从内存中释放,除非加载到单独的应用程序域中(并且我们需要取消分配整个应用程序域)。
但是在运行时编译的程序集是这种情况吗? 而且,如果需要,如何在单独的应用程序域中生成这些程序集?
例如,在我的情况下,是否需要此question中指示的方法(在这里我猜整个编译过程和运行时的使用应在单独的应用程序域中完成)?
答案 0 :(得分:1)
在我的战俘中,您在这里混淆了两件事:
您可以使用CodeDom Provider编译尽可能多的代码,然后将生成的CS代码写入任何位置,然后处置CodeDom编写器(CSharpCodeProvider),然后使用的内存就消失了。
在执行代码时,其内容完全不同。有几个库为您提供了一种执行Cs代码的方法,但是默认情况下,它们(大多数)都共享一个相同的问题。代码将在正在执行的应用程序内 中执行。这需要一个AppDomain,因为在.net环境中执行任何操作都被分配给一个。如果要将“不受信任的”代码执行与主机代码分开,则需要另一个AppDomain。
C#中的脚本(c#)库:
注意: CS脚本的执行涉及安全性。突破AppDomain的方式有无数种,无需花费很多精力就可以使您的appdomain免受那些攻击,您将在应用程序安全性概念中拥有庞大的整体。我最近进行了一次评估,并决定使用javascript作为脚本语言(通过Chakara.Core引擎)。