在项目属性的应用选项卡(红色)的顶部有 2 个灰色下拉框(绿色),我想使用它们。
我想根据当前的构建配置更改输出类型。当我进行调试构建时,我希望项目成为控制台应用程序以使用控制台进行调试输出。当我进行Release-build时,我希望该项目成为Windows Application。
那么如何启用灰色框?
注意:这是一个 C# 应用程序
在项目属性的应用选项卡(红色)的顶部有 2 个灰色下拉框(绿色),我想使用它们。
我想根据当前的构建配置更改输出类型。当我进行调试构建时,我希望项目成为控制台应用程序以使用控制台进行调试输出。当我进行Release-build时,我希望该项目成为Windows Application。
那么如何启用灰色框?
注意:这是一个 C# 应用程序
不能强制 Visual Studio 启用这些选项,但是可以通过手动编辑 csproj 文件来达到效果。MSBuild 确实非常强大,Visual Studio 倾向于隐藏其功能以简化基本用例。要编辑 csproj 文件,右键单击项目并选择 Unload Project,再次右键单击并选择 Edit。控制台应用程序的标准 csproj 在顶部看起来像这样
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{DE6C0E52-0B46-42E1-BA10-83C0B7B08A7F}</ProjectGuid>
<OutputType>Exe</OutputType>
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ServiceSample</RootNamespace>
<AssemblyName>ServiceSample</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
请注意元素 OutputType。那是我们想要改变的。值“Exe”对应于控制台应用程序,而“Winexe”对应于 Visual Studio UI 中的 Windows 应用程序。有几种方法可以做到这一点,但最简单的可能是使用选择元素。将此部分编辑为如下所示:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{DE6C0E52-0B46-42E1-BA10-83C0B7B08A7F}</ProjectGuid>
<!--<OutputType>Exe</OutputType>-->
<AppDesignerFolder>Properties</AppDesignerFolder>
<RootNamespace>ServiceSample</RootNamespace>
<AssemblyName>ServiceSample</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
</PropertyGroup>
<Choose>
<When Condition=" '$(Configuration)' == 'Debug' ">
<PropertyGroup>
<OutputType>Exe</OutputType>
</PropertyGroup>
</When>
<Otherwise>
<PropertyGroup>
<OutputType>Winexe</OutputType>
</PropertyGroup>
</Otherwise>
</Choose>
请注意,我们从主 PropertyGroup 中注释了 OutputType 并放入了 Choose 元素中的部分,它将根据 Configuration 属性的值选择值。
您不能根据配置更改项目的类型。所以控制台应用程序必须是控制台应用程序,Windows 应用程序必须是 Windows 应用程序。
您可能想要做的是这样的解决方案:
MySolution
Class Library Project (.DLL that contains all the code)
Console Application (.EXE that references the above .DLL)
Windows Application (.EXE that references the above .DLL)
然后,您可以为调试和发布构建所有三个,或者您可以使用解决方案配置管理器仅构建用于调试的控制台应用程序和用于发布的 Windows 应用程序。
好的,因为 Aaron 告诉我这是不可能的,所以我通过在运行时隐藏控制台窗口来解决它,而 DEBUG 变量未设置。
我使用了Stackoverflow 上另一个问题的一段代码:
using System.Runtime.InteropServices;
[DllImport("kernel32.dll")]
static extern IntPtr GetConsoleWindow();
[DllImport("user32.dll")]
static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
const int SW_HIDE = 0;
const int SW_SHOW = 5;
static void Main(string[] args)
{
#if !DEBUG
var handle = GetConsoleWindow();
ShowWindow(handle, SW_HIDE);
#endif
[...]
}