【问题标题】:Is there anyway to #define CONSTANT on a solution basis?无论如何要在解决方案的基础上#define CONSTANT?
【发布时间】:2011-07-13 04:41:51
【问题描述】:

是否有 #define Constant 基于 Visual Studio 解决方案?

可以在csproject的基础上定义一个常量,也可以把#define constant放到cs文件中,不知道能不能在vs sln的基础上定义呢?

【问题讨论】:

  • 这与链接的副本不同,因为链接的链接用于 C++ 和项目级别,而此链接用于 C# 和解决方案级别

标签: c# visual-studio visual-studio-2008


【解决方案1】:

从 MSBuild 15.0 开始,您可以使用 Directory.Build.props 为多个项目定义常量。 https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

它类似于 csproj,但它定义了将应用于子文件夹中所有 csproj 的值。

在文件夹树的顶部创建一个文件(以应用于所有子 csproj),名为 Directory.Build.props。

添加:

<Project>
 <PropertyGroup>
   <DefineConstants>MaConstante</DefineConstants>
 </PropertyGroup>
</Project>

【讨论】:

  • 如果你想覆盖/操作项目文件中定义的DefineConstants,你必须使用Directory.Build.targets,因为Directory.Build.props是在项目文件的开头导入的,该项目的DefineConstants 尚不可用。但是,您不能为 VB 项目覆盖 Directory.Build.targets 中的 DefineConstants,因为稍后传递给 VB 编译器的 $(FinalDefineConstants) 在导入 Directory.Build.targets 之前已经设置 - 请参阅:developercommunity.visualstudio.com/t/…
【解决方案2】:

这对于 Unity 项目是可能的。 创建一个名为
mcs.rsp(针对 .Net 3.5 等效版本)或
csc.rsp(针对 .Net 4.0 等效版本)
在 /Assets/ 文件夹中允许您这样做。

示例: /Assets/csc.rsp 文件包括:

-define:THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT
-define:ANOTHER_GLOBAL_PREPROCESSOR_CONSTANT

在项目中,在任何播放器或编辑器中的 c# 脚本中:

#if THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT
        Debug.Log("THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT is defined"); // compiles 
#else
        Debug.Log("THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT is not defined");
#endif

在 Unity 2019.1.2 上测试

https://docs.unity3d.com/Manual/PlatformDependentCompilation.html

【讨论】:

    【解决方案3】:

    我有另一种方法来做到这一点:

    1. 编辑全局配置文件。例如,在我的情况下,它是 .netcf2.0,所以它是 $(MSBuildBinPath)\microsoft.compactframework.csharp.targets

      添加以下行:

      <Import Project="$(SolutionDir)CommonSettings.targets" Condition="exists('$(SolutionDir)CommonSettings.targets')" />
      

      这是告诉 MSBuild 导入 CommonSettings.targets 是否存在于您的解决方案文件夹中。

    2. 在您的解决方案文件夹下创建 CommonSettings.targets。

      例如定义ABC符号:

      <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
          <PropertyGroup>
          <DefineConstants>$(DefineConstants);ABC</DefineConstants>
          </PropertyGroup>
      </Project>
      

    【讨论】:

    • 不要修改“系统”文件。而是以与您相同的方式修改依赖于标志的项目文件,因为这是一种很好的方式。因此我的 +1。
    • Condition="exists('...')" 是正确答案的原因。使您的公共属性文件具有与解决方案相似的名称,因此不同的解决方案不会拥有它,也不会加载它。
    【解决方案4】:

    您实际上可以将 Ritch 方法的变体与通用项目设置一起使用。本质上,您必须对解决方案中每个项目文件的末尾进行一次更改:

      <PropertyGroup Condition="'$(SolutionDir)' == '' or
                         '$(SolutionDir)' == '*undefined*'">
          <SolutionDir>..\..\</SolutionDir>
        </PropertyGroup>
        <Import Project="$(SolutionDir)CommonSettings.targets" />
      </Project>
    

    然后您可以定义 CommonSettings.targets 以包含解决方案范围的设置。

      <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
               ToolsVersion="3.5">
          <PropertyGroup>
              <TacoBuild>true</TacoBuild>
          </PropertyGroup>
      </Project>
    

    基本上就是这样,除非您想覆盖或合并每个项目中已经定义的项目设置。下面的链接详细讨论了如何执行此操作。

    http://www.ademiller.com/blogs/tech/2007/12/common-project-settings-for-your-visual-studio-solution/

    【讨论】:

    • 这是一个聪明的方法。我必须把那个添加到我的工具箱中。
    • 请注意,在我尝试(使用 Visual Studio 2012 Express)以这种方式为多个项目设置 DefineConstants 时,我能够正确构建它,但 Visual Studio 本身并不知道定义和因此#if / #endif 代码块的语法着色不正确。
    • 这种定义方式似乎对我不起作用,但 Tim 在您下面的解决方案似乎有效。任何想法为什么?
    • 我很乐意将其视为带有 UI 的 VS 扩展。如果有人有空闲时间,这将是一个很好的项目。
    【解决方案5】:

    间接存在。如果你设置一个带有标志的环境变量并运行VS:

    set TacoBuild=true
    devenv.eve bigproject.sln
    

    或从命令行启动 MSBuild:

    msbuild /p:TacoBuild=true
    

    在您的 .csproj 文件中,您需要添加一个 PropertyGroup:

    <PropertyGroup Condition="'$(TacoBuild)'=='true'">
        <DefineConstants>$(DefineConstants);TacoBuild</DefineConstants>
    </PropertyGroup>
    

    在您的代码中,您需要一个预处理器 def:

    #if TacoBuild 
        const int myConst = 42;
    #endif
    

    VS 唯一的替代方法是在构建设置中为新项目配置定义预处理器定义,并在构建中使用该配置。

    非 MSBuild 的解决方案是创建一个 constants.cs 文件并编写一个自定义设置工具来更新 cs 文件。我希望有更好的解决方案,但我还没有找到。

    【讨论】:

    • 问题是你只能通过命令行来做,但我希望能够启动一个IDE,设置constant,并为此运行F5调试构建。
    • @Graviton - 如果您要使用 IDE,为什么不创建一个包含解决方案中所有项目的单个 constants.cs 文件的项目?无论如何,我确实解决了如何在 IDE 中使用发布的技术。
    猜你喜欢
    • 2012-11-16
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多