加载后删除程序集

本文关键字:程序集 删除程序 删除 加载 | 更新日期: 2023-09-27 18:03:10

我正在尝试使用以下代码加载MSIL程序集:

string PathOfDll = "PathOfMsILFile (Dll)";
    Assembly SampleAssembly;
    SampleAssembly = Assembly.LoadFrom(PathOfDll);

在程序结束时,我应该删除这个文件:

File.Delete(PathOfDll);

导致错误:'System. 'UnauthorizedAccessException '

Additional information: Access to the path 'Path' is denied .

它与UAC无关,这只是因为我在程序开始时加载程序集,当我想手动删除它时,它说该文件在vshost.exe中使用。所以我这么说只是为了表明它是用于加载汇编的!

那么有没有办法摆脱它(像卸载这个程序集)?

注意:我正在写一个代码来运行垃圾收集器,但这个问题仍然没有解决。

谢谢。

加载后删除程序集

一种可能的方法是:用Load代替LoadFrom,如下图所示。

Assembly asm = null;
try
{
    asm = Assembly.Load(File.ReadAllBytes(path));
}
catch(Exception ex)
{
}

接受的答案存在内存泄漏问题。在deep中,程序集二进制文件被加载到内存中,并且在应用程序退出之前不会被释放。

我更喜欢使用AppDomain,它允许GC在使用后清理。示例代码由Rene de la garza在https://stackoverflow.com/a/6259172/7864940

提供。在短暂的

:

AppDomain dom = AppDomain.CreateDomain("some");     
AssemblyName assemblyName = new AssemblyName();
assemblyName.CodeBase = pathToAssembly;
Assembly assembly = dom.Load(assemblyName);
//Do something with the loaded 'assembly'
AppDomain.Unload(dom);