以编程方式设置应用程序输出类

Sas*_*nig 2 .net c# visual-studio

我正在使用命令行应用程序输出类型编写应用程序,以在MOGRE处理实际窗口创建时在控制台中显示调试信息.我想在编译应用程序时隐藏控制台.通过进入项目属性,应用程序选项卡并将输出类型更改为Windows应用程序,可以轻松地显示控制台.这样做时,只会显示MOGRE窗口.

虽然我相信创建一个Windows应用程序并将控制台连接到它时会更加清晰,但是当我想要这种行为时,我仍然很好奇天气可以以编程方式执行此操作.

也就是说,有没有办法以编程方式确定在调试模式下编译时应用程序编译为命令行应用程序,何时在发布模式下编译为Windows应用程序?如果是这样,怎么办呢?

编辑:我不是问如何将控制台附加到Windows窗体应用程序.我把重要的部分放在斜体中,希望能让我更清楚自己想要的东西.

Tig*_*ran 5

不太确定,如果有纯粹的.NET方法来实现你想要做的事情,但是有一种方法可以通过使用Windows API实现这一点:

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

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

[DllImport("kernel32", SetLastError = true)]
static extern bool AttachConsole(int dwProcessId);
Run Code Online (Sandbox Code Playgroud)

以下是可能对您有所帮助的代码示例:将控制台附加到Windows窗体应用程序


Sim*_*ier 5

如果手动编辑.csproj,则可以实现此目的:

  • 在解决方案资源管理器中右键单击项目节点
  • 选择"卸载项目"
  • 在解决方案资源管理器中右键单击项目节点
  • 选择"编辑MyApp.csproj"

<OutputType ../>属性组Xml元素从<PropertyGroup .../>Xml元素移动Condition到具有与构建配置/平台对应的条件的属性组.

之前:

<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    ...
    <OutputType>Exe</OutputType>
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

后:

<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
    ...
    <OutputType>Exe</OutputType>
    ...
  </PropertyGroup>
  <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
    ...
    <OutputType>WinExe</OutputType>
    ...
  </PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

并完成:

  • 在解决方案资源管理器中右键单击项目节点
  • 选择"重新加载项目"

这是一个证明示例:

class Program
{
    public static void Main(string[] args)
    {
#if DEBUG
        Console.WriteLine("test");
#else
        Application.Run(new Form1());
#endif
    }
}
Run Code Online (Sandbox Code Playgroud)

它有效,但我不认为这是官方支持,所以使用风险自负:-)