【问题标题】:Releasing from memory the code generated by CSharpCodeProvider从内存中释放 CSharpCodeProvider 生成的代码
【发布时间】:2012-12-27 09:38:42
【问题描述】:

我使用 CSharpCodeProvider 编译并在内存中生成一个新的命名空间,仅供临时使用。但是这个命名空间应该在一段时间后从内存中删除,以允许下一个生成的代码覆盖所有生成的类和方法的相同标识符。

【问题讨论】:

标签: c# .net memory csharpcodeprovider


【解决方案1】:

只有一种方法可以卸载已加载的类型:如果它是 collectible assembly 的一部分。

但可收藏程序集只能通过 Reflection.Emit 创建,而不能通过 CSharpCodeProvider 创建。正因为如此,我不确定使用收藏组件是否适合您。如果没有,您将需要一些其他选项(例如卸载 AppDomain)。

【讨论】:

  • 我想,我应该用“收藏集”试试这个。谢谢。
【解决方案2】:

没办法。类卸载仅在卸载 AppDomain 时发生 - 请注意。

最好的办法是在子应用程序域中进行所有代码生成(将是相同的过程),但这并非易事(子应用程序域需要通过远程处理所有可访问对象的代理)。

【讨论】:

  • 有没有其他方法可以临时使用生成的代码,然后从内存中释放它? (但不是 appdomains ...)使用子 appdomain 有多难?我将如何从那里调用 f.ex 方法? childappdomain.namespace.type.method() ?我不确定我是否会成功处理这个问题。
  • @DavidDiamond - 一般来说,这意味着您最终会将 90% 的代码放在子 AppDomain 中,以避免大多数序列化/远程处理问题
  • @Simon 这可能不是真的 - 这严重取决于应用程序的功能。但对于初级开发人员来说,这并不是一项轻松的工作——必须了解一些内部结构以及如何布置一个设计良好的应用程序。但与扩展 WCF 或使用 Direct3d 等一些内在奥秘相比,它仍然相当简单;)
  • 与 D3D 相比相当简单?不 。 WCF 也没有那么难。我现在的主要开发是 3D 游戏引擎(使用物理 HLSL 和任何可能的东西),但我也想为我的项目开发一些脚本语言以允许以某种方式实时编程。
  • 一旦你尝试做你自己的频道之类的事情,WDF 就很糟糕——innjards 很复杂,而且没有很好的文档记录。使用 AppDomain 至少“所需知识”很低 - 最后,设计需要公开的对象并制作它们需要大量工作,但它简单易懂。
【解决方案3】:

【讨论】:

  • 但是如果我要发布 Appdomain ,那么它的所有实例也会丢失。这与更新代码之前的应用程序重新启动相同(对我不利)。我想我会尝试“收藏集”解决方案。如果它没有帮助,那么我将尝试最终解决我的问题的 ICorDebug。 (在 VS 中,您可以在调试季节的运行时更改编译的源对象。它被称为代码注入,这是我试图用另一种方式做的事情,因为 ICorDebug 是非常复杂且庞大的 API)
  • 这就是您将每个脚本块隔离到一个单独的应用程序域的原因。而且她使用 WCF 很慢 - 跨应用程序域的删除已经过大量优化。
  • @TomTom:你在 1 句话中打错了 5 处,伙计 :))
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-15
  • 1970-01-01
  • 2013-05-16
  • 2015-10-19
  • 2011-07-17
  • 2015-08-12
相关资源
最近更新 更多