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

标签 .net assemblies

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




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/

相关文章:

.net - 不包括程序集版本的 WCF 扩展

c# - 如何为 AppDomain 预加载所有已部署的程序集

c# - RestSharp 不反序列化 JSON 对象列表,始终为 Null

c# - 是否存在链式 NULL 检查之类的东西?

c# - 自动化复杂的重构任务

ASP.Net 无法创建/卷影副本

c++ - .NET 程序集在运行时初始化

.net - MySQLCommand BeginExecuteReader 缺少一个 AsyncCallback 参数,使其几乎无用

c# - 转义 .NET 命令行参数的规范解决方案

c# - 我可以替换 ASP.NET 页面使用的供应商提供的方法吗?