簡體   English   中英

替換 C# .NET 應用程序使用的 Windows 共享文件夾上的 DLL

[英]Replacing a DLL on a Windows shared folder that is used by a C# .NET application

我們有一個企業管理軟件,我們的客戶將其部署到 Windows 網絡共享文件夾中,來自多個終端服務器的多個用戶從中啟動我們的程序。

我們試圖實現的是一種在用戶使用程序來應用補丁修復錯誤時替換 DLL 的方法。 目前奇怪的是,我們能夠重命名舊的 DLL 以替換和應用新的 DLL,而不會對正在使用的文件產生任何錯誤。

這給我們帶來了兩個問題:

  • 如果同一應用程序的實例仍在使用舊 DLL,則應用程序不會加載新 DLL(我認為這是https://en.wikipedia.org/wiki/DLL_Hell#Shared_in-memory_modules的情況)
  • 在替換之前運行的應用程序會向左和向右拋出異常,因為它們只是部分加載(延遲加載),並且何時需要查看文件中缺少的部分,IL 代碼不會不再匹配內存中的內容。

最重要的是,我認為我們正在做一些我們不應該做的事情:重命名正在使用的東西。

到目前為止,我發現的可能解決方案有兩個:

  • 使用啟用了卷影復制的新 AppDomain 啟動應用程序,但這並不可靠,因為每個客戶端都有自己的環境,我們可能會遇到意外的權限錯誤或類似的問題
  • 加載組件而不鎖定它們。 在本筆記中,我們研究了使用反射(我們實際上在某種程度上使用了反射),但我們不確定如何通過 DLL 已在項目中引用的反射程序集加載(我們有多個 DLL 引用其他 DLL正在引用其他 DLL 等....)。

你們中有人對如何安全地克服這個問題有任何其他想法嗎? 或者如何通過反射解決我上面提到的最后一點?

您可以嘗試窮人版的藍/綠部署。

將您的應用程序文件部署到兩個相同的文件夾中

\\SomeMachine\d$\MyApp\Green
\\SomeMachine\d$\MyApp\Blue

現在在根文件夾中放置一個快捷方式,如下所示:

\\SomeMachine\d$\MyApp\MyApp.lnk

從指向綠色文件夾中 .exe 的快捷方式開始。

告訴您的用戶始終使用快捷方式啟動應用程序(而不是導航到綠色或藍色文件夾並在那里啟動它)。

需要更新 DLL 時,請執行以下過程:

  1. 在 Blue 文件夾中進行修改
  2. 在 Blue 文件夾中執行任何需要的測試。
  3. 一旦您確定它有效,更新MyApp.lnk快捷方式以指向 Blue。

在您更新之前啟動其應用程序的用戶將繼續點擊綠色文件夾,直到他們退出應用程序。 任何重新啟動應用程序的人都會點擊藍色文件夾。

下次您必須更新 DLL 時,請反轉該過程。 在 Green 文件夾中進行修改,然后更新快捷方式以指向 Green。

這樣,您總是會更新一個沒人使用的文件夾,然后通過快捷方式使其可用。 只要人們不時退出應用程序,您就應該能夠無縫部署。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM