8

私の wpf アプリケーションから realtine 情報をログに記録するための追加のコンソール ウィンドウを追加したいと思います。何か案が??

バヨ

回答: プロジェクト プロパティのコンソール アプリケーションが機能します。ありがとう

4

5 に答える 5

5

しないでください。

ファイルへのログ出力については、log4netまたはNLogを参照しくださいこれらのフレームワークを適切に構成すると、より多くのパワーを得ることができます(さまざまなログレベル、自動タイムスタンプ、すべてのログ行の前にある自動クラス名)

また、使用中のロギングフレームワークを残りのコードから隠すために、独自のファサードを実装することもできます。これにより、必要に応じて、ロギングフレームワークを簡単に変更できます。


プログラムにコンソールとGUIウィンドウの両方が必要な場合は、プロジェクトをconsole applicationcsc /target:exe)としてコンパイルすることでこの動作を実装できます。ただし、注意してください。アプリにコンソールとGUIウィンドウの両方があることをユーザーが期待することはないため、これは間違いなくユーザビリティの低下につながります。

于 2011-09-26T17:21:26.547 に答える
5

AttachConsole WIN API 関数を呼び出してから、PInvoke を使用してこの関数を呼び出すことができます。

[DllImport("kernel32.dll", SetLastError = true)]
static extern bool AttachConsole(uint dwProcessId);

const uint ATTACH_PARENT_PROCESS = 0x0ffffffff;  // default value if not specifing a process ID

// Somewhere in main method
AttachConsole(ATTACH_PARENT_PROCESS);
于 2011-09-26T18:12:06.583 に答える
1

上記のアイデアをありがとう。コンソール ウィンドウを WPF アプリケーションに追加するために必要なすべての手順を次に示します。夜間のテスト プロセス中にコマンド ラインから呼び出すことができるように、WPF テスト アプリケーションを変更しました。唯一の不具合は、アプリケーションがコンソールから実行されるときです。FreeConsole() が呼び出されてアプリケーションが終了した後、コマンド プロンプトがすぐにコンソール ウィンドウに書き込まれません。FreeConsole() 関数には、コマンド プロンプトをコンソール ウィンドウに強制的に書き込む Flush() のような関数への呼び出しがないようです。私の理由は、コンソール ウィンドウの上/下矢印の履歴が利用可能であり、コンソールは別のコマンドを受け入れますが、次のアプリケーションが実行されてコンソール ウィンドウに書き込まれると、欠落しているコマンド プロンプトが書き込まれるということです。

  1. プロジェクト プロパティの [アプリケーション] タブで、[出力の種類] = [Windows アプリケーション] のままにします。
  2. App.xaml を右クリックし、[プロパティ] を選択します。
  3. ビルド アクション = ページを設定します。
  4. App.xaml.cs を開き、以下のように App クラスを変更します。

    public partial class App : Application
    {
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool AttachConsole(uint dwProcessId);
    
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool FreeConsole();
    
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern int GetConsoleTitle(System.Text.StringBuilder sbTitle, int capacity);
    
        [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        internal static extern bool SetConsoleTitle(string sTitle);
    
        [STAThread]
        public static int Main(string[] args)
        {
            Boolean hasExceptionOccured = false;
    
            System.Text.StringBuilder sbTitle = new System.Text.StringBuilder();
    
            try
            {
                // If the user does not provide any parameters assume they want to run in GUI mode.
                if (0 == args.Length)
                {
                    var application = new App();
                    application.InitializeComponent();
                    application.Run();
                }
                else
                {
                    const uint ATTACH_PARENT_PROCESS = 0x0ffffffff;  // Default value if not specifying a process ID.
    
                    // Attach to the console which launched this application.
                    AttachConsole(ATTACH_PARENT_PROCESS);
    
                    // Get the current title of the console window.
                    GetConsoleTitle(sbTitle, 64);
    
                    // Set the console title to the name and version of this application.
                    SetConsoleTitle(Global.thisProgramsName + " - v" + Global.thisProductVersion);
    
                    // Create a instance of your console class and call it’s Run() method.
                    var mainConsole = new ReportTester.MainConsole();
                    mainConsole.Run(args);                   
                }
            }
            catch (System.Exception ex)
            {
                System.Console.WriteLine(ex.Message);
                System.Console.WriteLine(ex.StackTrace);
                if (null != ex.InnerException)
                {
                    System.Console.WriteLine(ex.InnerException.Message);
                    System.Console.WriteLine(ex.InnerException.StackTrace);
                }
                hasExceptionOccured = true;
            }
            finally
            {
                // Since the console does not display the prompt when freed, we will provide one here.
                System.Console.Write(">");
    
                // Restore the console title.
                SetConsoleTitle(sbTitle.ToString());
    
                // Free the console.
                FreeConsole();
            }
    
            return (hasExceptionOccured ? 1 : 0);
        }
    }
    
于 2015-04-10T23:48:18.090 に答える