gpt4 book ai didi

.net - AppDomain.Unload 不释放我用反射加载的程序集

转载 作者:行者123 更新时间:2023-12-04 13:09:04 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:




9年前关闭。




Possible Duplicate:
how to delete the pluginassembly after AppDomain.Unload(domain)



在临时 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 而被释放吗?

最佳答案

我知道这是一个老问题,但仍然没有公认的答案。我偶然发现了这个问题以寻找答案,因此我认为发布我在这里找到的解决方案可能会很有用。

问题
tempAppDomain.Load(assemblyFileBuffer, symbolsFileBuffer);将程序集加载到 tempAppDomain ,但也会进入执行代码的应用程序域。您还必须卸载该应用程序域才能删除该文件。不过,您可能不想这样做。

解决方案

您必须执行从应用程序域加载程序集的代码 tempAppDomain .您可以使用 DoCallBack功能在 tempAppDomaintempAppDomain 中执行代码.如果您在那里加载程序集,那么您应该可以在调用 tempAppDomain.Unload() 后删除该文件。 .

例子

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);
}
}

来源

http://msdn.microsoft.com/en-us/library/system.appdomain.docallback.aspx
http://msdn.microsoft.com/en-us/library/36az8x58.aspx
https://stackoverflow.com/a/2475177/210336

关于.net - AppDomain.Unload 不释放我用反射加载的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1468151/

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