如何针对不同的构建配置使用不同的应用程序设置

时间:2014-07-25 00:11:44

标签: c# visual-studio-2012 buildconfiguration

在项目属性的Apllication-Tab(红色)的顶部,有2个灰色的下拉框(绿色),我想使用它。

Project properties

我想根据当前的构建配置更改输出类型。当我进行 Debug-build 时,我希望项目成为控制台应用程序,以使用控制台进行调试输出。 当我进行发布 - 构建时,我希望项目是 Windows应用程序

那么如何启用灰色框?

注意:它是C#-Application

3 个答案:

答案 0 :(得分:4)

您无法强制Visual Studio启用选项,但您可以通过手动编辑csproj文件来实现此效果。 MSBuild非常强大,Visual Studio倾向于隐藏其功能以简化基本用例。要编辑csproj文件,请右键单击该项目并选择“卸载项目”,再次右键单击并选择“编辑”。控制台应用程序的标准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应用程序。有几种方法可以做到这一点,但最简单的可能是Choose element。编辑此部分如下所示:

<?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属性的值选择值。

答案 1 :(得分:2)

您无法根据配置更改项目的类型。所以控制台应用程序必须是一个控制台应用程序,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应用程序。

答案 2 :(得分:0)

好的,因为Aaron告诉我这是不可能的,所以我通过在运行时隐藏控制台窗口来解决它,因为没有设置DEBUG变量。

我在Stackoverflow上使用了another question中的一段代码:

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
[...]
}