1

我想编写一个允许用户定义 GUI 驱动的代码片段的应用程序。

在这种情况下,我的目标是将这些片段定义发送到一个服务,该服务将能够出于多种目的编译和运行它(代码 dom、代码 dom 提供程序……)。

由于这些编译的程序集会生成很多次,我的问题是如何在需要时释放它们。

我知道从文件加载的程序集不能从内存中释放,除非加载到单独的应用程序域中(我们需要释放整个应用程序域)。

但是对于动态编译的程序集来说是这样吗?并且,如果需要,如何在单独的应用程序域中生成这些程序集?

例如,在我的情况下是否需要这个问题中指出的方法(这里我猜整个编译过程和运行时使用应该在一个单独的应用程序域中完成)?

4

1 回答 1

1

从我的战俘来看,你在这里混淆了两件事:

  1. 编译和
  2. 执行

您可以使用 CodeDom Provider 编译任意数量的代码并在任何地方编写生成的 cs 代码,然后您处理 CodeDom 编写器 (CSharpCodeProvider) 并且使用的内存就消失了。

执行代码时,它完全不同。有几个库为您提供了一种执行 Cs 代码的方式,但默认情况下它们(大部分)都存在相同的问题。代码将正在执行的应用程序中执行。这需要一个 AppDomain,因为在 .net 环境中执行任何操作都分配给一个。如果您想将“不受信任”的代码执行与您的主机代码分开,则需要另一个 AppDomain。

C# 中的脚本(c#)库:

注意:CS 脚本执行与安全有关。有无限的方法可以突破 AppDomain,并且无需花费大量精力来使您的 appdomain 免受这些攻击,您将在您的应用程序安全概念中拥有一个巨大的整体。我最近进行了评估,并决定改用 javascript 作为脚本语言(使用 Chakara.Core 引擎)。

于 2019-03-17T12:50:06.983 回答