簡體   English   中英

DLL不存儲字符串C#

[英]DLL doesn't store string C#

我有一個可以從Windows驅動器的資源管理器上下文菜單啟動的應用程序。 當您單擊菜單項時,驅動器號將傳遞到新實例。 我想確保所有舊實例都已關閉。

我還想確保選擇的最后一個驅動器得以保留,以便當我從啟動菜單再次啟動應用程序時,它會記住我最初選擇的驅動器。

最好是,已經運行的應用程序將收到一個事件,以便它可以更新而不必終止並重新啟動。


我嘗試了以下操作,但似乎不起作用:

這是我的類庫方法(只是定義變量的一行,所以我只有一個DLL,其中沒有變量)

 namespace Dispatch
 {
     public class cls_get_drive_letter
     {
         public static string drive_letter;
     }
 }

這是我的加載表單代碼:(這里我將填寫DLL的變量)

 private void Frm_loading_Load(object sender, EventArgs e)
 {
     Dispatch.cls_get_drive_letter.drive_letter = "XXX";
     Process currentProcess = Process.GetCurrentProcess();
     if (Process.GetProcessesByName(currentProcess.ProcessName, currentProcess.MachineName).Length >1)
     {
        currentProcess.Kill();
     }
 }  

因此,當我第一次運行此程序時,“ XXX”將存儲在DLL中,但是當應用程序的當前實例正在運行並且我要運行它的下一個實例時,由於以下代碼,該應用程序將被關閉:

 Process currentProcess = Process.GetCurrentProcess();
 if (Process.GetProcessesByName(currentProcess.ProcessName, currentProcess.MachineName).Length >1)
 {
     currentProcess.Kill();
 }

因此,當關閉代碼與此代碼一起發生時,新的“ XXX”將不會存儲在DLL中,而最后一個字符串將位於dll中。

所有變量(在這種情況下為靜態字段)將僅對於應用程序的運行實例保持不變。
再次啟動應用程序時,該字段為空

靜態變量不是存儲在“ dll內部”,而是存儲在加載dll的應用程序的內存中。 當應用程序的第二個實例啟動時,它將具有自己的內存空間,並且將具有自己的字符串變量版本。 該變量也不會保留在實例之間,因此,一旦啟動新實例,它將擁有自己的空字符串變量。

當應用程序停止時,該實例的內存被釋放,變量被“忘記”。

如果要在應用程序之間共享狀態,則有各種各樣的解決方案,例如System.Configuration.Settings API,某個位置的文件,在多個進程之間共享的內存映射文件,命名管道,內核信號量。 選項豐富。

除非我們確切了解您要在這種共享狀態下完成的工作,否則我們無法為您提供更好的選擇,而不是說明您當前正在做的事情對靜態變量的工作方式沒有作用。


根據新信息進行更新:

您可以將當前選擇的驅動器存儲在項目“設置”文件中 您可以從Visual Studio的項目屬性中添加此類文件。 有一個名為設置的標簽。 為“選定的驅動器”創建一個新設置,並將其設置為用戶設置(這樣,您就可以在沒有管理員權限的情況下進行更新)。

要將新的驅動器號傳達給您已在運行的應用程序,您可以有多種選擇。

  1. 首先,您可以檢查可執行文件是否已經在運行(就像您現在正在執行的那樣),在這種情況下,請更新設置文件並退出新實例。 您已經在運行的實例可以定期刷新設置以獲取新值。
  2. 當應用程序啟動時,您可以在計算機上打開一個命名管道,在該管道上偵聽驅動器更改。 當第二個實例啟動時,它可以檢測到管道已經存在,將新驅動器寫入管道並關閉。 已經運行的應用程序可以獲取此消息並更改其配置。
  3. 您可以將WindowMessage發送到其他應用程序
  4. 您可以托管一個簡單的WCF服務以接收通知
  5. 您可以將新的驅動器號寫入存儲在已知位置的文件中,並使另一個實例使用FileSystemWatcher來檢測對該文件的更改。
  6. 正如我所說,可能性是無限的。

如果您是我,那么我將首先通過在您的應用程序中實現Settings文件來確保在重新啟動之間保持該值不變。 然后研究一下我上面描述的選項,進行一些實驗,然后在無法弄清楚如何使其工作時提出新的問題。

暫無
暫無

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

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