2017-04-18 17 views
0

ClickOnce展開を使用するWPFアプリケーションがあります。起動時にいくつかのクエリパラメータがあり、それはApplicationDeployment.CurrentDeployment.ActivationUriになります。このメソッドはうまくいきましたが、今ではアプリケーションが単一インスタンスです。私たちはWindowsFormsApplicationBaseMicrosoft.VisualBasic dllから実装することによって "単一インスタンス"を処理します。現在実行中のアプリケーションインスタンスでClickOnceクエリパラメータを取得

アプリの新しいインスタンスが起動されたら、クエリパラメータを取得し、既に実行中のアプリケーションでそれらを処理する必要があります。私の問題は、一度クリックしてアプリを起動するとクエリパラメータを取得できないということです。

私はこのように、WindowsFormsApplicationBaseクラスのOnStartupNextInstanceをオーバーライドすることによって、パラメータを取得しようとしている:ClickOnceのを使って起動する場合

protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs) 
{ 
    var queryString = eventArgs.CommandLine; 
    //handle queryStringParams 
} 

eventArgs.CommandLineは0の要素を持っていますが、私は起動したときには、要素を持っていますこのようなコマンドラインから私のアプリ、:私はApplicationDeployment.CurrentDeployment.ActivationUriを介してそれらを取得しようとする場合

myApp.exe "param1=someValue&param2=someOtherValue" 

また、それは私に、現在のRのparamsを与えますアプリケーションを作る(明らかに)。

+0

AppDomainを試しましたか?CurrentDomain.SetupInformation.ActivationArguments.ActivationData [0]? – mm8

+0

@ mm8残念ながら 'ApplicationDeployment.CurrentDeployment.ActivationUri'と同じです - 現在実行中のインスタンスのデータ – Alex

+0

もちろん...現在実行中のインスタンスは、コマンドライン引数や他のインスタンスに関する何かを知っているはずですか? – mm8

答えて

0

私は私の予想通りにはそれほど単純ではありませんが、私の問題の解決策を見出しました。私の質問ですでに説明したように、既に起動しているアプリケーションが新しい起動したインスタンスのcmdパラメータをキャッチできる唯一の場所は、OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)の上書きです。コマンドパラメータはeventArgs引数で使用できますが、新しいインスタンスがClickOnce起動リンクから受け取ったパラメータは使用できません。

私が使用した溶液: に(私は少し私はここにClickOnceパラメータを取得する機会がなかったことを理解しながら、後に)私は、WindowsFormsApplicationBaseからそのまま継承しSingleInstanceManagerと呼ばれる別のクラスである、OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)を残しました。

代わりにvoid static Main(string[] args)の方法をApp.xaml.csに変更しました。主な変更:

  1. 私は ApplicationDeployment.CurrentDeployment.ActivationUriを通じてActivationUriを得ました。
  2. ActivationUriQueryプロパティの外にストリングを作成しました。
  3. この文字列をargsパラメータに追加しました。
  4. 上記パラメータ を記述したSingleInstanceManagerクラスにそのパラメータを渡しました。

全体のソリューションは、最終的には次のようになります。

 [STAThread] 
     public static void Main(string[] args) 
     { 
      AppDomain currentDomain = AppDomain.CurrentDomain; 

      //Creating SingleInstaceManager 
      SingleInstanceManager manager = new SingleInstanceManager(); 

      //Uncommend the following if statement if you want to debug App's Main method 
      //if (!System.Diagnostics.Debugger.IsAttached) 
      //{ 
      // System.Diagnostics.Debugger.Launch(); 
      //} 

      try 
      { 
       if (ApplicationDeployment.CurrentDeployment.ActivationUri != null) 
       { 
        var query = ApplicationDeployment.CurrentDeployment.ActivationUri?.Query; 

        var cmdParams = string.IsNullOrWhiteSpace(query) 
         ? new NameValueCollection(0) 
         : HttpUtility.ParseQueryString(query); 

        var updatedArgs = args.ToList(); 
        updatedArgs.Add(cmdParams.ToString()); 
        args = updatedArgs.ToArray(); 
       } 
      } 

      //Empty catch to ignore the annoying InvalidDeploymentException while debuging; 
      catch (InvalidDeploymentException) 
      { } 

      //Passing parameters to the SingleInstaceManager 
      manager.Run(args); 
     } 

注:

は、このソリューションは、唯一のWPF固有のものではない、それは限り、デスクトップアプリケーションの任意の種類のために働く必要がありますそれはあなたがActivationUriを得ることができるエントリーポイントを持っているので。これが誰かを助けることを願っています。

関連する問題