可能的重复:
如何在 AppDomain.Unload(domain) 之后删除插件程序集 https://stackoverflow.com/questions/425077/how-to-delete-the-pluginassembly-after-appdomain-unloaddomain
我在临时 AppDomain 中加载程序集以读取其 GetUsedReferences 属性时遇到问题。完成此操作后,我会调用 AppDomain.Unload(tempDomain),然后尝试通过删除文件来清理混乱。失败是因为文件被锁定。不过我卸载了临时域!任何想法或建议将不胜感激。这是我的一些代码:
//I already have btyes for the .dll and the .pdb from the actual files
AppDomainSetup domainSetup = new AppDomainSetup();
domainSetup.ApplicationBase = Environment.CurrentDirectory;
domainSetup.ShadowCopyFiles = "true";
domainSetup.CachePath = Environment.CurrentDirectory;
AppDomain tempAppDomain = AppDomain.CreateDomain("TempAppDomain", AppDomain.CurrentDomain.Evidence, domainSetup);
//Load up the temp assembly and do stuff
Assembly projectAssembly = tempAppDomain.Load(assemblyFileBuffer, symbolsFileBuffer);
//Then I'm trying to clean up
AppDomain.Unload(tempAppDomain);
tempAppDomain = null;
File.Delete(tempAssemblyFile); //I even try to force GC
File.Delete(tempSymbolsFile);
无论如何,删除失败,因为文件仍然被锁定。难道因为我卸载了临时AppDomain,它们不应该被释放吗?
我知道这是一个老问题,但仍然没有公认的答案。我偶然发现这个问题寻找答案,因此我认为发布我在这里找到的解决方案可能会有用。
Problem
tempAppDomain.Load(assemblyFileBuffer, symbolsFileBuffer);
将把程序集加载到tempAppDomain
,而且还进入执行代码的应用程序域。您还必须卸载该应用程序域才能删除该文件。但您可能不想这样做。
Solution
您必须执行从应用程序域加载程序集的代码tempAppDomain
。你可以使用DoCallBack
功能于tempAppDomain
执行代码tempAppDomain
。如果您在那里加载程序集,那么您应该能够在调用后删除该文件tempAppDomain.Unload()
.
Example
class Program
{
private static string assemblyPath = @"C:\Users\wesselm\Documents\Visual Studio 2010\Projects\ConsoleApplication1\ConsoleApplication1\bin\Debug\ClassLibrary1.dll";
static void Main(string[] args)
{
AppDomainSetup setup = new AppDomainSetup();
setup.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory;
var appDomain = AppDomain.CreateDomain("myAppDomain", null, setup);
// Loads assembly in both application domains.
appDomain.Load(AssemblyName.GetAssemblyName(assemblyPath));
// Only loads assembly in one application domain.
appDomain.DoCallBack(() => AppDomain.CurrentDomain.Load(AssemblyName.GetAssemblyName(assemblyPath)));
AppDomain.Unload(appDomain);
File.Delete(assemblyPath);
}
}
Sources
http://msdn.microsoft.com/en-us/library/system.appdomain.docallback.aspx http://msdn.microsoft.com/en-us/library/system.appdomain.docallback.aspx
http://msdn.microsoft.com/en-us/library/36az8x58.aspx http://msdn.microsoft.com/en-us/library/36az8x58.aspx
https://stackoverflow.com/a/2475177/210336 https://stackoverflow.com/a/2475177/210336
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)