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

4

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

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

或者,考虑加载生成的程序集的多个实例(当然是带有不同版本号的),如果释放所有未使用的引用,那么可能会被gc/framework卸载吗?

还有一个问题-在这种情况下是否会发生任何“冲突”(不确定这是否是正确的词)?

1个回答

7
组件只能通过整个应用程序域卸载。根据需要加载的动态组件数量,将它们加载到默认应用程序域中并让它们保留在内存中直到应用程序关闭可能是可以接受的。但是,如果您认为您会有太多的组件,内存消耗将成为一个问题,您需要在单独的应用程序域中加载它们,使用AppDomain.DoCallBack在应用程序域边界上进行调用,并定期卸载应用程序域。例如,在Visual Studio中,T4主机将编译的组件加载到单独的应用程序域中,最多可进行25个代码生成会话,然后卸载应用程序域以回收内存。
与单独的应用程序域需要发生的额外调用相比,性能影响将微不足道,因为需要即时编译和生成组件所需的影响。仅当跨域调用的数量很大时,才会成为问题。您可能需要测试AppDomain.DoCallBack的性能,以确定性能是否对您的方案可接受。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接