程序完成后释放文件

时间:2017-08-09 21:11:55

标签: vb.net iis dll

我继承了一个在我的服务器上运行的vb.net中构建的Web应用程序项目(运行IIS 8的Windows Server 2012)。该项目依赖于一些.dll库,这些库也是由我公司在一个单独的项目中构建的,并将错误消息输出到.txt文件。该项目的主要结构是由一位不再与我公司合作的前任程序员建立的。我得到了一些复制粘贴代码,以便在需要时添加新的.dll,但它是如何工作的从未真正向我解释过,并且没有在评论或其他任何类似的文档中记录。

我发现如果我触发项目运行,我无法删除被调用的.dll文件或.txt文件,直到程序运行完毕很久(Windows告诉我该文件仍在使用中) 。我预计一旦使用它们的进程完成,项目就会释放这些文件。我在服务器上的实时环境中运行时以及在本地计算机(Windows 10)上进行调试时都注意到了这种情况。

这引出了一些相关的问题:

  • 如果文件在流程完成后立即释放,那么它们什么时候发布?
  • 当项目在服务器上运行时,如果两个用户同时尝试访问相同的.dll或写入.txt文件会发生什么?
  • 在.dll调用强制.dll在其执行的指定点释放后,是否有任何代码可以放入我的项目中?如果这不是可以在代码中完成的事情,那么在程序运行完成后是否还有其他方法可以释放文件(比如编译器或我的服务器上的某些设置或标志)?

1 个答案:

答案 0 :(得分:1)

文本文件的dll 都被锁定的事实让我相信原始程序员可能忘记关闭/处置他们的文件处理程序。最简单的方法是:a)如果你有权访问源代码,添加行来关闭文件,或者b)使用JetBrains的DotPeek来反编译dll,看看你是否可以从那里找出问题。
至于一次只允许使用某个代码块,请考虑使用Monitor.Enter()命名空间中的Monitor.Exit()System.Threading函数来锁定"一次一个用户的代码块。如果您熟悉Debian,这在理论上与dpkg如何同时停止安装/删除/ etc等两个程序相似。 如果您想手动终止某个流程,请尝试Array.ForEach(Process.GetProcessesByName("PROCESS NAME HERE"), Sub(x) x.Kill())