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

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

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

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

还有一个问题 – 在这种情况下会不会有任何“碰撞”(不确定这是否是正确的词?)?

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

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