gpt4 book ai didi

c# - 应用程序使用的 DLL 的热卸载/重新加载

转载 作者:IT王子 更新时间:2023-10-29 04:09:44 25 4
gpt4 key购买 nike

我有一个加载 DLL 以执行处理的特定部分的应用程序

Example : "Application.dll" loading "Process.dll" 

Process.dll 在运行时动态加载,使用反射,并且未在应用程序中引用。

处理完成后,需要在服务器端重新编译DLL,稍后再加载回来。
为此,我需要释放它,否则我会收到以下消息:“无法将文件“Process.dll”复制到“Process.dll”。进程无法访问文件“Process.dll”,因为它正被另一个进程使用。”

所以问题是:如何以编程方式从我的应用程序中释放/释放/卸载 Process.dll,然后再重新加载它。当然,重点是在停止应用程序的情况下执行此操作。

编辑 1:

建议的解决方案是这样的:

AppDomain newDomain4Process = AppDomain.CreateDomain("newDomain4Process");
Assembly processLibrary = newDomain4Process.Load("Process.dll");
AppDomain.Unload(newDomain4Process);

我仍然遇到的问题是,虽然我提供了正确的完整路径,但我得到了一个FileNotFound Exceptionthis post的答案也没有达到预期的效果。

编辑 2:

This post救了我的命,这是代码:

class ProxyDomain : MarshalByRefObject
{
public Assembly GetAssembly(string AssemblyPath)
{
try
{
return Assembly.LoadFrom(AssemblyPath);
}
catch (Exception ex)
{
throw ex;
}
}
}

ProxyDomain pd = new ProxyDomain();
Assembly a = pd.GetAssembly(FullDLLPath);

编辑 3 :
我没有访问 AppDomain 并使用以前的解决方案卸载它。当我使用 AppDomain Creation 的经典方法时,我感受到了 Alexei 的警告:AppDomain.Unload“似乎”可以工作,但程序集仍被加载(模块 View )。所以我在某些方面仍然遇到问题,因为我无法真正有效地卸载 DLL。

最佳答案

自从我查看此内容以来已经有一段时间了,但我相当确定您需要创建一个新的 AppDomain然后在其中加载 DLL。

原因是您无法自行卸载 Assembly,但可以卸载包含 AssemblyAppDomain

关于c# - 应用程序使用的 DLL 的热卸载/重新加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4887847/

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