0

addDownload()メインアプリケーションクラス内にあるメソッドMainWindow.xaml.csを呼び出す必要がありますApp.xaml.cs

アプリケーションに関する情報:

  • App.xaml.csには、アプリケーションのインスタンスを 1 つだけ実行するコードがあります。(私のコードではありません。見つけました)

    using System;
    using System.Diagnostics;
    using System.Reflection;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Windows;
    using DownloadManager;
    namespace DownloadManager
    {
        public partial class App : Application
    {
        private static readonly Semaphore singleInstanceWatcher;
        private static readonly bool createdNew;
    
        static App()
        {
            // Ensure other instances of this application are not running.
            singleInstanceWatcher = new Semaphore(
                0, // Initial count.
                1, // Maximum count.
                Assembly.GetExecutingAssembly().GetName().Name,
                out createdNew);
    
    
    
            if (createdNew)
            {
                // This thread created the kernel object so no other instance
                // of this application must be running.
            }
            else
            {
            // This thread opened an existing kernel object with the same
            // string name; another instance of this app must be running now.
    
            // Gets a new System.Diagnostics.Process component and the
            // associates it with currently active process.
                Process current = Process.GetCurrentProcess();
    
                foreach (Process process in
                     Process.GetProcessesByName(current.ProcessName))
                {
                    if (process.Id != current.Id)
                    {
                        NativeMethods.SetForegroundWindow(
                            process.MainWindowHandle);
                        NativeMethods.ShowWindow(process.MainWindowHandle,
                            WindowShowStyle.Restore);
                        break;
                    }
                }
    
                // Terminate this process and gives the underlying operating 
                // system the specified exit code.
                Environment.Exit(-2);
            }
        }
    
        private static class NativeMethods
        {
            [DllImport("user32.dll")]
            internal static extern bool SetForegroundWindow(IntPtr hWnd);
            [DllImport("user32.dll")]
            internal static extern bool ShowWindow(IntPtr hWnd,
                WindowShowStyle nCmdShow);
        }
    
        /// <summary>
        /// Enumeration of the different ways of showing a window.</summary>
        internal enum WindowShowStyle : uint
        {
            Hide = 0,
            ShowNormal = 1,
            ShowMinimized = 2,
            ShowMaximized = 3,
            Maximize = 3,
            ShowNormalNoActivate = 4,
            Show = 5,
            Minimize = 6,
            ShowMinNoActivate = 7,
            ShowNoActivate = 8,
            Restore = 9,
            ShowDefault = 10,
            ForceMinimized = 11
        }
    }
    }
    
  • addDownload()アプリケーションが既に実行されているかどうかに関係なく、毎回コマンド ライン パラメータをメソッドに渡す必要があります。

私がこれまでに試したこと:

  • まず、App.xaml の Startup エントリ ポイントを削除して、コード ビハインド内で管理できるようにしました。

  • 次に、アプリケーションが実行されていない場合は、MainWindow の新しいインスタンスを作成して表示します。

    MainWindow MW = new MainWindow();
    MW.Show();
    
  • コマンド ライン パラメータを取得し、addDownload()メソッドに渡します。

    string[] args = Environment.GetCommandLineArgs();
    if(args.Length > 1)
    {
        MW.addDownload(args[1]);
    }
    

わかりました、この部分は完全に機能します。

しかし、私が言うように、アプリケーションが既に実行されている場合にも、コマンド ライン パラメータを渡す必要があります。コマンド ライン パラメーターを取得するのは以前と同じですが、それをaddDownload()現在の MainWindow インスタンスのメソッドに渡すのはそうではなく、機能する方法を見つけるのに苦労しています。

私は試した:

try
{
    var main = App.Current.MainWindow as MainWindow;
    string[] args = Environment.GetCommandLineArgs();
    if (args.Length > 1)
    {
        main.addDownload(args[1]);
    }
}
catch(Exception ex)
{
    MessageBox.Show(String.Format("{0}\n{1}", ex.GetType().ToString(), ex.Message));
}

しかし、私は NullReferenceException を取得します..main宣言について考えます..Visual Studio 内でこの特定の状況をデバッグする方法がわかりません。

何か助けはありますか?私が間違っているのは何ですか?

4

1 に答える 1

0

別のプロセスに存在するNullReferenceExceptionオブジェクト ( ) のインスタンスにアクセスしたいので、 を取得しますが、それを行うことはできません。行う必要があるのは、ある種の InterProcess 通信です。これを行うには多くの方法がありますが、そのうちの 1 つは .NET リモート処理を使用することです (おそらく最善の方法ではありません)。MainWindow

クイック検索で見つかったいくつかのリンクを次に示します。

http://www.codeproject.com/Articles/17606/NET-Interprocess-Communication

.NET プロセス間通信の最適な選択は何ですか?

http://msdn.microsoft.com/en-us/library/kwdt6w2k(v=vs.100).aspx

于 2013-08-28T01:13:13.933 に答える