gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:47:16 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

与动态编译和生成程序集的影响相比,单独的 AppDomain 需要进行的额外编码对性能的影响微不足道。只有当跨域调用的数量很大时,它才会成为一个问题。您可能需要测试 AppDomain.DoCallBack 的性能以确定性能是否适合您的场景。

关于c# - 动态加载和卸载使用 CSharpCodeProvider 生成的 dll,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1162686/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com