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 をロードするアプリケーションのメモリ内に格納されます。アプリケーションの 2 番目のインスタンスが起動すると、独自のメモリ空間があり、独自のバージョンの文字列変数があります。変数はインスタンス間でも保持されないため、新しいインスタンスを開始するとすぐに、独自の空の文字列変数が作成されます。

アプリケーションが停止すると、そのインスタンスのメモリが解放され、変数は「忘れられます」。

アプリケーション間で状態を共有したい場合、あらゆる種類のソリューションがあります。1 つは、System.Configuration.Settings API、どこかにあるファイル、複数のプロセス間で共有されるメモリ マップ ファイル、名前付きパイプ、カーネル セマフォです。オプション豊富。

この共有状態で何を達成しようとしているのかを正確に理解するまでは、静的変数が機能する方法に対して、現在行っていることは機能しないという説明よりも優れた代替手段を提供することはできません.


新しい情報に基づく更新:

現在選択されているドライブをプロジェクトの設定ファイルに保存できます。このようなファイルは、Visual Studio のプロジェクト プロパティから追加できます。設定というタブがあります。「選択したドライブ」の新しい設定を作成し、それをユーザー設定にします (そうすれば、管理者権限なしで更新できます)。

既に実行中のアプリケーションに新しいドライブ文字を伝えるには、いくつかのオプションがあります。

  1. 1 つには、実行可能ファイルが既に実行されているかどうかを確認し (現在行っているように)、その場合は設定ファイルを更新して新しいインスタンスを終了することができます。すでに実行中のインスタンスは、定期的に設定を更新して新しい値を取得できます。
  2. アプリケーションの起動時に、ドライブの変更をリッスンするマシンで名前付きパイプを開くことができます。2 番目のインスタンスが開始すると、パイプが既に存在することを検出し、新しいドライブをパイプに書き込んで閉じます。すでに実行中のアプリケーションは、このメッセージを受け取り、その構成を変更できます。
  3. WindowMessage を他のアプリケーションに送信できます
  4. 単純な WCF サービスをホストして、通知を受け取ることができます
  5. 新しいドライブ文字を既知の場所に保存されているファイルに書き込み、他のインスタンスに FileSystemWatcher を使用してそのファイルへの変更を検出させることができます。
  6. 私が言ったように、可能性は無限大です。

私があなたなら、アプリケーションに設定ファイルを実装して、再起動間で値が保持されるようにします。次に、上で説明したオプションを調査し、いくつかの実験を行い、それを機能させる方法がわからない場合は、新しい質問をします。

于 2013-02-12T11:49:56.457 に答える