0

我有一个可以从 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 中。

4

2 回答 2

4

所有变量,在本例中为静态字段,只会在应用程序的运行实例中保持不变。
当应用程序再次启动时,该字段为空

于 2013-02-12T11:46:01.897 回答
2

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

当应用程序停止时,该实例的内存被释放并且变量被“遗忘”。

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

在我们准确了解您要通过此共享状态完成什么之前,我们无法为您提供比您现在正在做的事情的解释更好的选择,这对静态变量的工作方式不起作用.


根据新信息更新:

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

要将新的驱动器号传达给您已经运行的应用程序,您有多种选择。

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

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

于 2013-02-12T11:49:56.457 回答