在解决方案基础上有#define Constant吗?

时间:2011-03-11 02:02:34

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

在Visual Studio解决方案基础上有#define Constant吗?

可以在csproject的基础上定义一个常量,并且可以将#define constant放在cs文件中,但是我想知道是否可以在vs sln的基础上定义它?

5 个答案:

答案 0 :(得分:19)

您可以使用常见项目设置实际使用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/

答案 1 :(得分:12)

我有另一种做法:

  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>
    

答案 2 :(得分:6)

间接存在。如果使用标志设置环境变量并运行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文件的自定义设置工具。我希望有更好的解决方案,但我还没找到。

答案 3 :(得分:0)

这对于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

答案 4 :(得分:0)

从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>