我想知道如何卸载加载到主AppDomain中的程序集.
我有以下代码:
var assembly = Assembly.LoadFrom( FilePathHere );
Run Code Online (Sandbox Code Playgroud)
当我完成时,我需要/希望能够卸载这个程序集.
谢谢你的帮助.
我正在创建一些工具,执行NUnit等多个操作.在这个工具里面,我打开.dll程序集并调用方法形成它来运行一些测试.
一切都好,直到我需要重新加载.dll,程序重启.我们的想法是,当工具运行时,我们将所需的程序集复制到一些临时文件夹并从那里调用.如果我需要重新加载,我将另一个复制到另一个临时文件夹,并尝试从另一个文件夹加载新复制并加载到以前的程序集对象
ExecutingAssembly = Assembly.LoadFrom(AssemblyFullPath);
Run Code Online (Sandbox Code Playgroud)
但我的问题是,在我将AssemblyFullPath更改为新的并调用Assembly.LoadFrom之后,它只返回刚装入的第一次加载而不是第二次加载!也许问题是我们无法加载具有不同版本的多个程序集?解决办法是什么?
在.net框架中可以在单独的AppDomain中加载程序集然后卸载它.在.net核心AppDomain不可用,并由AssemblyLoadContext取代.我可以将程序集加载到AssemblyLoadContext,如下所示:
var assembly = AssemblyLoadContext.Default.LoadFromStream(stream);
Run Code Online (Sandbox Code Playgroud)
有没有办法卸载它?
我们正在构建一个.NET应用程序,我们加载外部代码程序集("插件").到目前为止,我们将这些程序集加载到单个(主)应用程序域中.
我们希望能够在加载后卸载它.
为此,我们正在设计一个系统,该系统将创建一个单独的辅助AppDomain来托管插件程序集,以便随意卸载.
我们用这种方法遇到的问题:
在这种情况下,是否存在对应用程序进行分区的常见做法?我们可以采用的最佳解决方案是什么?
另一个有趣的问题 - 为什么MarshalByRef没有属性并迫使我们从一个对象派生出来?
我正在尝试使用以下代码加载MSIL程序集:
string PathOfDll = "PathOfMsILFile (Dll)";
Assembly SampleAssembly;
SampleAssembly = Assembly.LoadFrom(PathOfDll);
Run Code Online (Sandbox Code Playgroud)
在该程序的结尾,我应该删除该文件:
File.Delete(PathOfDll);
Run Code Online (Sandbox Code Playgroud)
它导致错误:'System.UnauthorizedAccessException'
Additional information: Access to the path 'Path' is denied .
Run Code Online (Sandbox Code Playgroud)
它与UAC无关,只是因为我在程序开始时加载程序集,而当我想手动删除它时,它表示该文件正在vshost.exe中使用。所以我说这只是为了表明它是用于组装的!
那么有什么方法可以摆脱它(类似于卸载此程序集)?
注意:我正在编写代码来运行垃圾收集器,但此问题仍未解决。
谢谢。