如何在不同的构建配置中使用不同的应用程序设置?

3
在项目属性的应用程序选项卡(红色)的顶部有2个灰色的下拉框(绿色),我想要使用它们。 我希望根据当前的构建配置更改输出类型。当我进行“调试构建”时,我希望该项目成为“控制台应用程序”,以便使用控制台进行调试输出。 当我进行“发布构建”时,我希望该项目成为“Windows应用程序”。 那么如何启用这些灰色的框? 注意:这是一个C#应用程序。

控制台应用程序与WinForms应用程序非常不同。听起来你只是想能够从你的WinForms应用程序输出调试消息。你可以通过使用跟踪侦听器并在代码中放置Debug或Trace调用来实现这一点。请参阅http://msdn.microsoft.com/en-us/library/sk36c28t(v=vs.110).aspx。 - Igby Largeman
@IgbyLargeman:您能否分享一个示例来演示如何实现这一点,除了提供链接之外?链接可能会过期(尤其是微软的链接)。 - LostPhysx
3个回答

5

您无法强制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元素。将此部分编辑为以下内容:

<?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
这正是我一直在寻找的。非常感谢! - LostPhysx

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)

你可以选择同时为debug和release构建所有三个应用程序,或者使用解决方案配置管理器仅为debug构建控制台应用程序,为release构建Windows应用程序。


+1 点赞你的创意,但是由于这个游戏已经足够复杂了,将其整合到我的项目中会变得一团糟。此外,控制台应用程序与 Windows 应用程序具有相同的窗口,但还额外拥有一个控制台。如果 DEBUG 变量未设置,我可以尝试通过编程方式隐藏控制台... - LostPhysx
@Paedow:控制台应用程序没有窗口。 - Igby Largeman
如果将项目创建为Windows Forms项目并将输出类型更改为控制台应用程序,则可以同时使用控制台和WinForms。您还可以将项目创建为控制台应用程序,手动添加对Sys.Win.Forms的引用并创建窗体。 - LostPhysx

0

好的,既然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
[...]
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接