【问题标题】:How to use different Application Settings for different build configurations?如何为不同的构建配置使用不同的应用程序设置?
【发布时间】:2014-09-16 17:40:42
【问题描述】:

在项目属性的应用选项卡(红色)顶部有 2 个灰色下拉框(绿色),我想使用它们。

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

那么如何启用灰色框?

注意:这是一个 C# 应用程序

【问题讨论】:

  • 控制台应用程序与 winforms 应用程序有很大不同。听起来您只想能够从您的 winforms 应用程序输出调试消息。您可以通过使用跟踪侦听器并将 Debug 或 Trace 调用放入您的代码中来做到这一点。见msdn.microsoft.com/en-us/library/sk36c28t(v=vs.110).aspx
  • @IgbyLargeman:除了此链接之外,您能否分享一个答案,在其中展示如何执行此操作?链接可能会过期(尤其是微软链接)

标签: c# visual-studio-2012 buildconfiguration


【解决方案1】:

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

【讨论】:

  • 创造力+1,但由于这应该成为一个已经足够复杂的游戏,因此无法集成到我的项目中。此外,控制台应用程序将具有与 Windows 应用程序相同的 Windows,但另外还有一个控制台。如果未设置 DEBUG 变量,我可以尝试以编程方式隐藏控制台...
  • @Paedow:控制台应用程序没有窗口。
  • 如果您将项目创建为 Windows 窗体项目并将输出类型更改为控制台应用程序,您可以使用控制台和 winforms。您还可以将项目创建为控制台应用程序并手动添加对 Sys.Win.Forms 的引用并创建表单
【解决方案2】:

好的,因为 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
[...]
}

【讨论】:

    【解决方案3】:

    不能强制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 属性的值来选择值。

    【讨论】:

    • 这正是我正在寻找的。非常感谢!
    猜你喜欢
    • 2013-03-19
    • 2021-01-11
    • 2010-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2011-07-21
    相关资源
    最近更新 更多