.net - 'assembly purgatory' 发生了什么?

标签 .net windows assemblies gac file-locking

当一个 .NET 程序集被部署到 GAC 并且目标文件被锁定时,Windows 将它保存在我最能猜测是某种“程序集炼狱”的地方 - c:\windows\assembly\temp.

使用 Process Explorer 在搜索可疑 DLL 时可以很容易地看到这些:

Process Explorer Search
(来源:alexangas.com)

一旦我结束进程锁定文件(在本例中为 OWSTIMER.EXE),它就会神奇地正确部署到 GAC。

我很好奇 Windows 在这里实际做了什么。它如何知道文件锁何时被释放?它在哪里保存锁定文件的记录?它会放弃吗?

最佳答案

Temptmp 是 GAC 程序集安装和卸载期间使用的临时文件夹。 Tmp用于安装,Temp用于卸载。 来源:GAC Temp and Tmp

.NET 运行时优化服务 (mscorsvw.exe) 可能会不时地探测文件以检查它们是否已关闭,以便它可以 [卸载] 安装挂起的程序集。

我可能错了,但据我所知,没有 WinAPI 会通知您某个文件已关闭/解锁。你必须自己监视它们。但是 Windows 本身在内存中的某处必须有这样一个列表(至少它有一个打开的句柄列表),所以它只知道文件已关闭,因为代表文件的句柄已释放。

关于.net - 'assembly purgatory' 发生了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1188763/

相关文章:

html - MongoDB,为博客应用程序存储带图像的格式化文本的方式

windows - 有没有办法在 SVN 仓库中设置文件。在结帐时被自动忽略?

windows - NET START <SERVICE> - 如何/从哪里获取服务名称?

.net - 我们可以添加到数据表的总行数

c# - 将 session 包装为属性时直接保护访问 session 的方法?

c# - 字典的线程安全

.net - 如何在Windows Vista和更高版本(WIndows 7,2008)中看到.NET程序集的程序集版本?

windows - 升级安装后 Vista/Win7 资源管理器快捷方式中的应用程序图标损坏

c# - 项目引用解决方案 .net 4.5 和 .net 3.5

c# - .NET/C# - 反射帮助 - 程序集中的类