如何在运行时获取构建配置?

问题描述 投票:0回答:8

有谁知道如何在 C# 代码中获取当前的构建配置

$(Configuration)

c# configuration
8个回答
31
投票

.NET 中有 AssemblyConfigurationAttribute。您可以使用它来获取构建配置的名称

var assemblyConfigurationAttribute = typeof(CLASS_NAME).Assembly.GetCustomAttribute<AssemblyConfigurationAttribute>();
var buildConfigurationName = assemblyConfigurationAttribute?.Configuration;

22
投票

如果您卸载项目(在右键菜单中)并将其添加到

</Project>
标签之前,它将保存一个包含您的配置的文件。然后您可以将其读回以在您的代码中使用。

<Target Name="BeforeBuild">
    <WriteLinesToFile File="$(OutputPath)\env.config" 
                      Lines="$(Configuration)" Overwrite="true">
    </WriteLinesToFile>
</Target>

19
投票

更新

Egors对此问题的回答(在此答案列表中的here)是正确答案。

你不能,不是真的。
你可以做的是定义一些“条件编译符号”,如果你查看项目设置的“构建”页面,你可以在那里设置它们,这样你就可以编写#if语句来测试它们。

自动注入 DEBUG 符号(默认情况下,可以将其关闭)以进行调试构建。

所以你可以写这样的代码

#if DEBUG
        RunMyDEBUGRoutine();
#else
        RunMyRELEASERoutine();
#endif

但是,除非有充分的理由,否则不要这样做。在调试和发布版本之间具有不同行为的应用程序对任何人都没有好处。


10
投票

可以使用条件编译符号来实现这一点。您可以在每个项目的“属性”>“构建设置”窗格中定义自定义符号,并使用 #if 指令在代码中测试它们。

示例显示如何定义符号 UNOEURO 以及如何在代码中使用它。

UNOEURO symbol defined here

bool isUnoeuro = false;
#if UNOEURO
    isUnoeuro = true;
#endif

5
投票
  1. 安装 SlowCheetah Visual Studio 扩展。
  2. 右键单击您的配置文件并选择“添加转换”。

  1. 注意每个构建配置的转换。

  1. 将“Build”appSetting 放入根配置文件中:
    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
          <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8" />
        </startup>
      <appSettings>
        <add key="Build" value="" />
      </appSettings>
    </configuration>
  1. 并在每个转换中放置一个“Build”指令:
    <?xml version="1.0" encoding="utf-8"?>
    <!--For more information on using transformations see the web.config examples at http://go.microsoft.com/fwlink/?LinkId=214134. -->
    <configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
      <appSettings>
        <add key="Build" value="Debug" xdt:Transform="Replace" xdt:Locator="Match(key)"/>
      </appSettings>
    </configuration>
  1. 然后在 C# 代码中获取“Build”appSetting 值:

ConfigurationManager.AppSettings["Build"]



2
投票

您可以使用带有条件属性的常见静态方法来设置标志来检测DEBUG或RELEASE模式。 SetDebugMode 方法仅在 DEBUG 模式下运行时才会被调用,否则会被 Runtime 忽略。

public static class AppCompilationConfiguration
{
    private static bool debugMode;

    private static bool IsDebugMode()
    {
        SetDebugMode();
        return debugMode;
    }

    //This method will be loaded only in the case of DEBUG mode. 
    //In RELEASE mode, all the calls to this method will be ignored by runtime.
    [Conditional("DEBUG")]
    private static void SetDebugMode()
    {
        debugMode = true;
    }

    public static string CompilationMode => IsDebugMode() ? "DEBUG" : "RELEASE";

}

您可以在下面的代码中调用它

 Console.WriteLine(AppCompilationConfiguration.CompilationMode);

0
投票

我不相信您可以在编译时将其注入程序集中,但实现它的一种方法是使用 MSBuild 并将其添加到应用程序的配置文件中。

请参阅此博客文章,了解如何使用 MSBuild 执行多环境配置文件 - http://adeneys.wordpress.com/2009/04/17/multi-environment-config/

或者,您可以编写一个 MSBuild 任务,该任务将编辑某个编译文件(您的 C# 或 VB 文件),并在

BeforeBuild
任务中运行该任务。这将相当棘手,因为您需要弄清楚将其注入文件的位置,但只要您设置了某种标记化,您应该能够做到这一点。我也怀疑它会很漂亮!


0
投票

作为补充,无论您使用“Conditional”还是#DebugOrWhatever:如果您的构建配置包含“Release.Debug”中的点,则必须使用“Release_Debug”(带下划线)。

© www.soinside.com 2019 - 2024. All rights reserved.