C# 如何基于参数运行显示或不显示控制台窗口的dotnet Core控制台应用程序?

C# 如何基于参数运行显示或不显示控制台窗口的dotnet Core控制台应用程序?,c#,.net-core,console-application,avaloniaui,C#,.net Core,Console Application,Avaloniaui,我有一个dotnet core GUI应用程序,根据参数参数,它可能只显示GUI界面(使用Avalonia framework完成),或者如果它收到一些特殊参数,那么它应该在控制台模式下工作,并登录控制台而不显示GUI。 如果我使用WinExe,则GUI显示良好,但应用程序永远不会登录控制台(例如,当使用console.WriteLine(“某些文本”))。 这意味着我需要使用Exe配置csproj,以便能够登录控制台中的任何内容,问题是当在GUI模式下运行时,与GUI应用程序窗口一起,会弹出另

我有一个dotnet core GUI应用程序,根据参数参数,它可能只显示GUI界面(使用Avalonia framework完成),或者如果它收到一些特殊参数,那么它应该在控制台模式下工作,并登录控制台而不显示GUI。 如果我使用
WinExe
,则GUI显示良好,但应用程序永远不会登录控制台(例如,当使用
console.WriteLine(“某些文本”)
)。 这意味着我需要使用
Exe
配置csproj,以便能够登录控制台中的任何内容,问题是当在GUI模式下运行时,与GUI应用程序窗口一起,会弹出另一个控制台窗口,我想隐藏该窗口以仅显示GUI

在dotnetfullframework4.X中,我能够创建WPF应用程序,该应用程序在1exe中实现了这种双控制台/gui模式。 一个可能的解决方案是,如果我可以在GUI模式下运行时隐藏控制台窗口,或者Avalonia UI/dotnet core有其他方法来实现这一点。 有人知道怎么做吗

更新:以下是一些澄清: 该应用程序有两种模式:

  • GUI模式:如果您只需双击“App.exe”(运行时不带参数),则GUI应显示(并且仅显示GUI,而不是GUI加上当前出现的另一个控制台窗口)。这通常是通过将csproj设置为
    WinExe
    来实现的,但这会使
    控制台.Write
    功能在以下
    控制台模式下运行时不起作用
  • 控制台模式:如果高级用户试图从控制台使用某些应用程序功能,则该应用程序的行为应类似于控制台应用程序,并具有所有预期功能,如
    app.exe-h
    显示可用命令,
    app.exe-v
    显示版本,这意味着显示一些手工制作的GUI窗口来显示输出文本或在其他任何地方(如文件中)是不合适的
它可以在两个单独的可执行文件中完成,但像我这样的一些人发现,应用程序只是一个简单的app.exe文件,其中有一些优点。
这种双重行为有很多例子,比如VisualStudio的
devenv.exe
或应用程序。

如果我没弄错,您希望在特殊参数和WinForms应用程序上启动控制台

首先,你必须设置

<DisableWinExeOutputInference>true</DisableWinExeOutputInference>
我在当地试过这个

<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>net5.0-windows</TargetFramework>
      <UseWindowsForms>true</UseWindowsForms>
      <DisableWinExeOutputInference>true</DisableWinExeOutputInference>
   </PropertyGroup>
</Project>

Exe
net5.0-windows
真的
真的
但老实说,在我的选择中,您应该使用共享库编译两个exe文件,以完成控制台exe文件和UI exe文件fe.:

yourcode.csproj(您的业务逻辑)

  • yourapp-console.csproj(控制台应用程序:引用yourcode.csproj)
  • yourapp-ui.csproj(WinForms应用程序:引用yourcode.csproj)

我想我不明白这个问题。听起来你想把一些文本输出到一个没有人能看到的窗口。是这样吗?重点是什么?如果我理解,您希望根据应用程序接收的参数显示GUI或控制台。如果是这样,为什么不在控制台模式下使用e方法“LogToConsole”在Console.WriteLine中写入,而在GUI模式下则什么都不做?您对控制台感兴趣只是为了记录信息吗?如果是这样,那么只需登录到一个文件就可能更容易了。@JohnWu:当它作为GUI运行时,它不会写入控制台,并且控制台窗口不应该显示。但是当它作为ConsoleMode运行时,它不应该显示GUI,而只是写入控制台。问题是我找不到在运行时控制控制台窗口可见性的方法。如果我将csproj设置为
WinExe
,那么它在GUI模式下工作良好,而不是在ConsoleMode下(因为它不会向控制台发送任何内容)。如果我将csproj设置为
Exe
,那么它在ConsoleMode上运行良好,但在GUI模式下不起作用(因为这样它将打开两个窗口:一个是GUI,另一个是控制台窗口)“就像VisualStudio的
devenv.Exe
”—您是指
devenv.com
devenv.Exe
”,前者是一个控制台应用程序,如果在命令行上运行
devenv
,您会得到它,而后者是一个windows GUI应用程序?它们可能没有像你想象的那样得到实施。哇,非常感谢你的回复!我认为您完全理解了这个问题。但是解决方案并不完全完美,它有一些缺陷:-如果您试图从命令行以GUI模式打开app.exe,则使用用于隐藏控制台的
ShowWindow()
方法,它将隐藏您正在从中调用
\App.exe
的现有终端窗口!(在windows 10中使用PowerShell 7.1终端进行测试)-当双击
App.exe
打开GUI时,控制台窗口会闪烁一秒钟,即使是第1行,理想情况下也不会出现。另一个主要问题是,即使是GUI应用,这并不意味着我使用的是WinForms或WPF之类的纯windows框架。我正在使用,这是跨平台的(windows/Mac/Linux),但此解决方案仅适用于windows。@Lorazo对此表示抱歉,但这是我通过使用单个编译找到的唯一选项。这就是为什么我添加了imo更好的解决方案来编译两个不同的exe文件,并使用共享的代码库。
<Project Sdk="Microsoft.NET.Sdk">
   <PropertyGroup>
      <OutputType>Exe</OutputType>
      <TargetFramework>net5.0-windows</TargetFramework>
      <UseWindowsForms>true</UseWindowsForms>
      <DisableWinExeOutputInference>true</DisableWinExeOutputInference>
   </PropertyGroup>
</Project>