开发者

Is there anyway to #define CONSTANT on a solution basis?

开发者 https://www.devze.com 2023-02-16 07:35 出处:网络
Is There anyway to 开发者_运维技巧#define Constant on a Visual Studio Solution Basis? One can define a constant on a csproject basis, and one can put #define constant in cs file, but I wonder whether

Is There anyway to 开发者_运维技巧#define Constant on a Visual Studio Solution Basis?

One can define a constant on a csproject basis, and one can put #define constant in cs file, but I wonder whether one can define it on a vs sln basis?


You can actually use a variation on Ritch's approach with common project settings. Essentially you have to make a single change to the end of each project file in your solution:

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

Then you can define CommonSettings.targets to contain the solution wide settings.

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

That's basically it unless you want to override or merge project settings already defined in each project. The link below discusses how to do this in some detail.

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


I have another approach for doing this:

  1. Edit global config file. For example in my case it's .netcf2.0 so it's $(MSBuildBinPath)\microsoft.compactframework.csharp.targets.

    Add the following line:

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

    This is to tell MSBuild import the CommonSettings.targets if it's existed in your solution folder.

  2. Create CommonSettings.targets under your solution folder.

    For example to define ABC symbol:

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


Indirectly there is. If you set an environment variable with a flag and run VS:

set TacoBuild=true
devenv.eve bigproject.sln

or launch MSBuild from the command line:

msbuild /p:TacoBuild=true

In your .csproj files you need to add a PropertyGroup:

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

In your code you need a preprocessor def:

#if TacoBuild 
    const int myConst = 42;
#endif

A VS only alternative is to define a preprocessor definition in the build settings for a new project configuration and use that configuration in your build.

A non MSBuild solution is to create a constants.cs file and write a custom settings tool that updates the cs file. I wish there were a better solution, but I haven't found one.


Starting with MSBuild 15.0, you can use Directory.Build.props to define constants over multiple projects. https://learn.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

It is like a csproj but it defines values thaty will apply to all csproj in children folders.

Create a file at the top of your folder tree (to apply to all children csproj), named Directory.Build.props.

Add:

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


I have another option that doesn't involve editing any project files with custom XML.

But it does require custom code in each project that detects each possible solution.

If you put $(SolutionName) in the project preprocessor defines then you can use #ifdefs to check which solution the project is compiling in and provide different configurations for each solution respectively.

This might not fit everyone's situation but this worked for me and solved my issues where I had the same project being used by multiple solutions but requiring ever so slightly different configurations.


This is possible for Unity projects. Creating a file called
mcs.rsp (targeting .Net 3.5 Equivalent) or
csc.rsp (targeting .Net 4.0 Equivalent )
in /Assets/ folder allows you to do that.

Example : /Assets/csc.rsp file includes:

-define:THIS_IS_MY_GLOBAL_PREPROCESSOR_CONSTANT
-define:ANOTHER_GLOBAL_PREPROCESSOR_CONSTANT

In the project, in any player or editor c# script:

#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

Tested on Unity 2019.1.2

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

0

精彩评论

暂无评论...
验证码 换一张
取 消