2017-08-09 70 views
0

我已經繼承了在我的服務器(運行IIS 8的Windows Server 2012)上運行的vb.net中構建的Web應用程序項目。該項目依賴於某些.dll庫,這些庫也是由我的公司在單獨的項目中構建的,並將錯誤消息輸出到.txt文件。這個項目的主要結構是由一位不在我公司的程序員創建的。我需要一些複製粘貼代碼來添加新的.dll文件,但是它的工作原理從來沒有真正向我解釋過,並且沒有真正記錄在註釋或其他任何類型的文件中。程序結束後發佈文件

我發現如果我觸發項目運行,我無法刪除被調用的.dll文件或.txt文件,直到程序運行結束很久(Windows告訴我該文件仍在使用中)。我預計項目會在使用它們的過程完成後立即發佈這些文件。我在服務器的實時環境中運行時以及在本地計算機上調試時都注意到了這種行爲(Windows 10)。

這使我幾個相關的問題:

  • 如果文件不盡快處理完成使用它們釋放出來,當他們釋放?
  • 當項目在服務器上運行時,如果兩個用戶試圖訪問相同的.dll或同時寫入.txt文件會發生什麼情況?
  • 在我的.dll調用強制將.dll發佈到指定執行位置後,是否可以在我的項目中放入任何代碼?如果這不是代碼中可以完成的事情,那麼在程序運行完成後(如編譯器或我的服務器中的某些設置或標誌),還有其他方法可以讓文件釋放嗎?
+0

查找在執行期間啓動的服務或附加進程,這些進程可能正在訪問這些文件。 – djv

+0

該項目的工作流程非常線性。該項目接收來自用戶的請求,執行一些處理以獲取.dll的輸入,調用.dll,處理.dll的輸出並向用戶發送響應。即使在發送響應之後,該.dll仍然被鎖定。 .txt文件僅由.dll寫入(Web應用程序本身不使用它)。據我所知,不應該有任何額外的進程使用這些文件。 – GeneralMike

回答

1

,無論是DLL 文本文件被鎖定使我相信,原來的程序員可能已經忘記了關閉/處置其文件處理的事實。最簡單的方法是:a)如果您有權訪問源代碼,請添加該行以關閉該文件,或者b)使用JetBrains中的DotPeek來反編譯dll並查看是否可以從那裏確認問題。
至於只允許一次使用某個代碼塊,請考慮使用System.Threading名稱空間中的Monitor.Enter()Monitor.Exit()函數來一次「鎖定」一個用戶的代碼塊。如果你對Debian很熟悉,這與哲學上的dpkg同時阻止兩個程序被安裝/刪除/ etc是類似的。
如果要手動殺死進程,請嘗試Array.ForEach(Process.GetProcessesByName("PROCESS NAME HERE"), Sub(x) x.Kill())

+0

感謝您的回答。我認爲這讓我走上了正軌,但我走上了另一個絆腳石。我需要自己弄清楚幾件事情,如果我有更多問題或任何事情,我會更新我的文章。 – GeneralMike