DLL没有';t存储字符串C#

本文关键字:存储 字符串 没有 DLL | 更新日期: 2023-09-27 17:58:52

我有一个应用程序,可以从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没有';t存储字符串C#

所有变量,在本例中是一个静态字段,将仅对正在运行的应用程序实例保持不变
当应用程序再次启动时,字段为空

静态变量不是存储在"dll内部",而是存储在加载dll的应用程序的内存中。当应用程序的第二个实例启动时,它将有自己的内存空间,并有自己版本的字符串变量。变量也不保留在实例之间,因此一旦启动新实例,它就会有自己的空字符串变量。

当应用程序停止时,该实例的内存将被释放,变量将被"遗忘"。

如果你想在应用程序之间共享状态,有各种各样的解决方案,其中之一可以是System.Configuration.Settings API、某个文件、多个进程之间共享的内存映射文件、命名管道、内核信号量。选项丰富。

在我们确切了解你试图用这种共享状态实现什么之前,我们无法为你提供比解释你现在所做的不会对静态变量的工作方式起作用更好的选择。


根据新信息更新:

您可以将当前选择的驱动器存储在项目的"设置"文件中。您可以从Visual Studio中的项目属性添加此类文件。有一个标签叫做设置。为"选定驱动器"创建一个新设置,并将其设为用户设置(这样您就可以在没有管理员权限的情况下更新它)。

要将新的驱动器号与已运行的应用程序通信,您有许多选项。

  1. 首先,你可以检查你的可执行文件是否已经在运行(就像你现在所做的那样),在这种情况下,更新设置文件并退出新实例。您已经运行的实例可以定期刷新设置以获取新值
  2. 当应用程序启动时,您可以在机器上打开一个命名管道,在该管道上侦听驱动器更改。当第二个实例启动时,它可以检测到管道已经存在,将新驱动器写入管道并关闭。已经运行的应用程序可以接收此消息并更改其配置
  3. 您可以向其他应用程序发送WindowMessage
  4. 您可以托管一个简单的WCF服务来接收通知
  5. 您可以将新的驱动器号写入存储在已知位置的文件,并让另一个实例使用FileSystemWatcher来检测对该文件的更改
  6. 正如我所说,可能性是无穷的

如果我是你,我会首先通过在应用程序中实现Settings文件来确保在重新启动之间保持该值。然后研究我上面描述的选项,做一些实验,然后在你不知道如何让它发挥作用时提出新的问题。