无论如何在解决方案基础上#define Constant?

Gra*_*ton 27 c# visual-studio-2008 visual-studio

无论如何#define Constant在Visual Studio解决方案基础上?

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

Ade*_*ler 19

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

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

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

  <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"
           ToolsVersion="3.5">
      <PropertyGroup>
          <TacoBuild>true</TacoBuild>
      </PropertyGroup>
  </Project>
Run Code Online (Sandbox Code Playgroud)

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

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


小智 12

我有另一种做法:

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

    添加以下行:

    <Import Project="$(SolutionDir)CommonSettings.targets" Condition="exists('$(SolutionDir)CommonSettings.targets')" />
    
    Run Code Online (Sandbox Code Playgroud)

    这是告诉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>
    
    Run Code Online (Sandbox Code Playgroud)


小智 8

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

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

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

添加:

<Project>
 <PropertyGroup>
   <DefineConstants>MaConstante</DefineConstants>
 </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)


Rit*_*ton 6

间接有.如果您使用标志设置环境变量并运行VS:

set TacoBuild=true
devenv.eve bigproject.sln
Run Code Online (Sandbox Code Playgroud)

或者从命令行启动MSBuild:

msbuild /p:TacoBuild=true
Run Code Online (Sandbox Code Playgroud)

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

<PropertyGroup Condition="'$(TacoBuild)'=='true'">
    <DefineConstants>$(DefineConstants);TacoBuild</DefineConstants>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

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

#if TacoBuild 
    const int myConst = 42;
#endif
Run Code Online (Sandbox Code Playgroud)

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

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