私の wpf アプリケーションから realtine 情報をログに記録するための追加のコンソール ウィンドウを追加したいと思います。何か案が??
バヨ
回答: プロジェクト プロパティのコンソール アプリケーションが機能します。ありがとう
私の wpf アプリケーションから realtine 情報をログに記録するための追加のコンソール ウィンドウを追加したいと思います。何か案が??
バヨ
回答: プロジェクト プロパティのコンソール アプリケーションが機能します。ありがとう
しないでください。
ファイルへのログ出力については、log4netまたはNLogを参照してください。これらのフレームワークを適切に構成すると、より多くのパワーを得ることができます(さまざまなログレベル、自動タイムスタンプ、すべてのログ行の前にある自動クラス名)
また、使用中のロギングフレームワークを残りのコードから隠すために、独自のファサードを実装することもできます。これにより、必要に応じて、ロギングフレームワークを簡単に変更できます。
プログラムにコンソールとGUIウィンドウの両方が必要な場合は、プロジェクトをconsole application
(csc /target:exe
)としてコンパイルすることでこの動作を実装できます。ただし、注意してください。アプリにコンソールとGUIウィンドウの両方があることをユーザーが期待することはないため、これは間違いなくユーザビリティの低下につながります。
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);
上記のアイデアをありがとう。コンソール ウィンドウを WPF アプリケーションに追加するために必要なすべての手順を次に示します。夜間のテスト プロセス中にコマンド ラインから呼び出すことができるように、WPF テスト アプリケーションを変更しました。唯一の不具合は、アプリケーションがコンソールから実行されるときです。FreeConsole() が呼び出されてアプリケーションが終了した後、コマンド プロンプトがすぐにコンソール ウィンドウに書き込まれません。FreeConsole() 関数には、コマンド プロンプトをコンソール ウィンドウに強制的に書き込む Flush() のような関数への呼び出しがないようです。私の理由は、コンソール ウィンドウの上/下矢印の履歴が利用可能であり、コンソールは別のコマンドを受け入れますが、次のアプリケーションが実行されてコンソール ウィンドウに書き込まれると、欠落しているコマンド プロンプトが書き込まれるということです。
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);
}
}