我有一个应用程序加载DLL来执行特定的处理部分
Example : "Application.dll" loading "Process.dll"
Run Code Online (Sandbox Code Playgroud)
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);
Run Code Online (Sandbox Code Playgroud)
我仍然遇到的问题是,虽然我给出了正确的完整路径,但我得到了一个FileNotFound Exception.这篇文章的答案也没有预期的效果.
编辑2:
这篇文章救了我的命,这里是代码:
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);
Run Code Online (Sandbox Code Playgroud)
编辑3:
我没有访问AppDomain并使用之前的解决方案卸载它.当我使用经典的AppDomain创建方法时,我感觉到阿列克谢的警告:AppDomain.Unload"似乎"工作,但程序集仍然被加载(模块视图).所以我仍然以某种方式遇到问题,因为我无法真正有效地卸载DLL.
Han*_*son 17
我看了这个已经有一段时间,但我很确定你需要创建一个新的AppDomain,然后在那里加载DLL.
原因是你不能自己卸载一个Assembly,但你可以卸载一个AppDomain包含一个Assembly.
这是一篇CodeProject文章,描述了如何执行此操作:卸载正在运行的Dll
装配件装入后AppDomain,就无法卸载.你必须处理掉AppDomain.如果需要在应用程序中加载和卸载程序AppDomain集,则需要生成一个新程序并加载程序集,然后AppDomain在完成程序集后销毁它.
虽然您似乎根据您的编辑解决了这个问题,但这里有几条评论:
注意Process.dll"泄漏"到主AppDomain中的对象.就像抛出Process.dll中定义的自定义异常并在主AppDomain中捕获的东西一样,会强制将Process.dll加载到主AppDomain中.执行您感兴趣的操作后,检查主AppDomain中已加载程序集的列表.
卸载AppDomain可能会失败,可能需要很长时间.
| 归档时间: |
|
| 查看次数: |
53490 次 |
| 最近记录: |