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

时间:2011-10-19 20:33:57

标签: c# .net visual-studio

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

虽然我认为创建一个Windows应用程序并在需要这种行为时将控制台附加到它上会更加清晰我仍然很好奇天气可以以编程方式执行此操作。

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

编辑:我询问如何将控制台附加到Windows窗体应用程序。我把重要的部分用斜体来表达,希望能让我更清楚自己想要的东西。

2 个答案:

答案 0 :(得分: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);

以下是可能对您有所帮助的代码示例:Attach Console to Windows Forms application

答案 1 :(得分: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>

后:

<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>

结束:

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

以下是一个证明示例:

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

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