动态加载和卸载使用CSharpCodeProvider生成的dll

时间:2009-07-22 01:58:44

标签: c# code-generation

我有一个应用程序,它使用一些代码脚本在运行时生成dll并根据需要调用它们并在我开始编码之前遇到一些问题!

是否可以在不需要时从内存中卸载它们? 如果不是 - 将它们加载到单独的appdomains并使用某些ipc等调用调用会对性能产生什么影响 - 顺便说一句,这需要具有高性能/实时性

或者,如何加载生成的程序集的多个实例(当然使用不同版本的#)?我假设你释放所有未使用的引用,它可能会被gc / framework卸载吗?

同样是Q - 在这种情况下是否会出现任何“碰撞”(不确定这是否是正确的词?)?

1 个答案:

答案 0 :(得分:7)

只能使用整个AppDomain卸载程序集。根据您需要加载的动态程序集的数量,可以将它们加载到默认的AppDomain中,并让它们保留在内存中,直到关闭应用程序。但是,如果您认为自己的内存太多并且内存消耗将成为问题,则需要在单独的AppDomain中加载它们,使用AppDomain.DoCallBack来编组跨AppDomain边界的调用并定期卸载AppDomain。例如,Visual Studio中的T4主机将编译的程序集加载到单独的AppDomain中,最多可存储25个代码生成会话,然后卸载AppDomain以回收内存。

与动态编译和生成程序集的影响相比,使用单独的AppDomain进行额外编组的性能影响将是微不足道的。如果跨域调用的数量很大,它将成为一个问题。您可能需要测试AppDomain.DoCallBack的性能,以确定性能是否可以接受您的方案。