如何 运行 dotnet Core 控制台应用程序显示控制台 window 或不基于参数参数?
How to run dotnet Core console application that shows the console window or not based on argument parameters?
我有一个 dotnet-core GUI 应用程序,根据参数参数,它可能只显示 GUI 界面(使用 Avalonia 框架完成),或者如果它收到一些特殊参数,那么它应该在控制台模式下工作并记录进入控制台而不显示 GUI。
如果我使用 <OutputType>WinExe</OutputType>
,则 GUI 显示正常,但应用程序永远不会登录到控制台(例如使用 Console.WriteLine("some-text")
时)。
这意味着我需要使用 <OutputType>Exe</OutputType>
配置 csproj 以便能够登录到控制台,问题是当 运行 在 GUI 模式下,以及 GUI 应用程序 window, 另一个控制台 window 弹出,我想隐藏它只显示 GUI。
在 dotnet 全框架中 4.X 我能够创建在 1 个 exe 中执行此双重 console/gui 模式的 WPF 应用程序。
一个可能的解决方案是,如果我可以在 GUI 模式下 运行 时隐藏控制台 window,或者 Avalonia-UI/dotnet-core 有其他方法可以做到这一点。
有人知道怎么做吗?
更新:这里有一些说明:
该应用程序有 2 种模式:
- GUI 模式:如果您只是双击“App.exe”(运行s,没有 args 参数)然后 GUI 应该出现(并且只有 GUI,而不是 GUI 加上另一个控制台 window,因为它目前正在发生)。这通常通过将 csproj 设置为
<OutputType>WinExe</OutputType>
来完成,但这会使 Console.Write
函数在以下 Console Mode
. 中的 运行 时不起作用
- 控制台模式:如果高级用户尝试使用控制台中的某些应用程序功能自动执行某些操作,则该应用程序的行为应类似于控制台应用程序,所有人们期望的功能
app.exe -h
显示可用命令,app.exe -v
显示版本等。这意味着显示一些手工制作的 GUI window 显示输出是不可行的将文本或日志记录到其他任何地方,例如文件。
它可以在 2 个单独的可执行文件中完成,但是像我这样的一些人在只是一个简单的 app.exe 文件的应用程序中发现了一些美妙之处。
这种双重行为有很多示例,例如 VisualStudio 的 devenv.exe
或 Nirsoft 应用程序。
如果我没看错,你想在特殊参数和 WinForms 应用程序上启动控制台。
首先你要设置
<DisableWinExeOutputInference>true</DisableWinExeOutputInference>
在你的项目文件中。 See documentation
尝试将 <OutputType>
设置回 Exe
并将其添加到您的 Program > Main:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
IntPtr h = GetConsoleWindow();
// switch here to show or not show console window
ShowWindow(h, 0);
// ShowWindow(h, 1);
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Hide your WinForms application manually if parameter is set
var startup = new MainFormStartup();
Application.Run(startup.CreateForm<MainWindow>());
}
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
}
我在本地尝试过
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<DisableWinExeOutputInference>true</DisableWinExeOutputInference>
</PropertyGroup>
</Project>
但老实说,在我看来,你应该有两个用共享库编译的 exe 文件来完成一个控制台 exe 文件和一个 UI-exe 文件,fe.:
yourcode.csproj(您的业务逻辑)
- yourapp-console.csproj(控制台应用程序:参考yourcode.csproj)
- yourapp-ui.csproj(WinForms 应用程序:参考yourcode.csproj)
我有一个 dotnet-core GUI 应用程序,根据参数参数,它可能只显示 GUI 界面(使用 Avalonia 框架完成),或者如果它收到一些特殊参数,那么它应该在控制台模式下工作并记录进入控制台而不显示 GUI。
如果我使用 <OutputType>WinExe</OutputType>
,则 GUI 显示正常,但应用程序永远不会登录到控制台(例如使用 Console.WriteLine("some-text")
时)。
这意味着我需要使用 <OutputType>Exe</OutputType>
配置 csproj 以便能够登录到控制台,问题是当 运行 在 GUI 模式下,以及 GUI 应用程序 window, 另一个控制台 window 弹出,我想隐藏它只显示 GUI。
在 dotnet 全框架中 4.X 我能够创建在 1 个 exe 中执行此双重 console/gui 模式的 WPF 应用程序。 一个可能的解决方案是,如果我可以在 GUI 模式下 运行 时隐藏控制台 window,或者 Avalonia-UI/dotnet-core 有其他方法可以做到这一点。 有人知道怎么做吗?
更新:这里有一些说明: 该应用程序有 2 种模式:
- GUI 模式:如果您只是双击“App.exe”(运行s,没有 args 参数)然后 GUI 应该出现(并且只有 GUI,而不是 GUI 加上另一个控制台 window,因为它目前正在发生)。这通常通过将 csproj 设置为
<OutputType>WinExe</OutputType>
来完成,但这会使Console.Write
函数在以下Console Mode
. 中的 运行 时不起作用
- 控制台模式:如果高级用户尝试使用控制台中的某些应用程序功能自动执行某些操作,则该应用程序的行为应类似于控制台应用程序,所有人们期望的功能
app.exe -h
显示可用命令,app.exe -v
显示版本等。这意味着显示一些手工制作的 GUI window 显示输出是不可行的将文本或日志记录到其他任何地方,例如文件。
它可以在 2 个单独的可执行文件中完成,但是像我这样的一些人在只是一个简单的 app.exe 文件的应用程序中发现了一些美妙之处。
这种双重行为有很多示例,例如 VisualStudio 的 Nirsoft 应用程序。devenv.exe
或
如果我没看错,你想在特殊参数和 WinForms 应用程序上启动控制台。
首先你要设置
<DisableWinExeOutputInference>true</DisableWinExeOutputInference>
在你的项目文件中。 See documentation
尝试将 <OutputType>
设置回 Exe
并将其添加到您的 Program > Main:
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
IntPtr h = GetConsoleWindow();
// switch here to show or not show console window
ShowWindow(h, 0);
// ShowWindow(h, 1);
Application.SetHighDpiMode(HighDpiMode.SystemAware);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
// Hide your WinForms application manually if parameter is set
var startup = new MainFormStartup();
Application.Run(startup.CreateForm<MainWindow>());
}
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
}
我在本地尝试过
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0-windows</TargetFramework>
<UseWindowsForms>true</UseWindowsForms>
<DisableWinExeOutputInference>true</DisableWinExeOutputInference>
</PropertyGroup>
</Project>
但老实说,在我看来,你应该有两个用共享库编译的 exe 文件来完成一个控制台 exe 文件和一个 UI-exe 文件,fe.:
yourcode.csproj(您的业务逻辑)
- yourapp-console.csproj(控制台应用程序:参考yourcode.csproj)
- yourapp-ui.csproj(WinForms 应用程序:参考yourcode.csproj)