解决方案范围内的#define

bev*_*qua 51 c# c-preprocessor

有没有办法全局声明#define?

就像我想拥有一个文件,例如,

#define MONO
Run Code Online (Sandbox Code Playgroud)

我希望所有源代码文件都知道这个预处理器指令已经定义.我怎么做到这一点?

BJ *_*die 36

更新:您不能在"解决方案范围"定义afaik,但下面的答案可以在每个项目的基础上工作.

您可以在编译属性或构建选项中设置它们:

http://msdn.microsoft.com/en-US/library/76zdzba1(v=VS.80).aspx(VS2008) http://msdn.microsoft.com/en-US/library/76zdzba1(v=VS .100).aspx(VS2010)

请参阅"设置自定义常量"标题.

更新

有关构建选项的Microsoft文档

右键单击项目并从菜单中选择属性,即可进入构建选项.

项目构建选项

  • 我不认为这回答了关于_solution_ wide`#define`的问题? (21认同)
  • 它可能不适合"解决方案范围"方面,但它肯定比简单地说"你不能那样做"更好. (10认同)
  • 这不是问题的答案 (6认同)
  • 这不是问题的答案,而是误导,浪费人们的时间。 (3认同)
  • 你有可能添加截图,尽管按照信中的说明操作,我根本看不到VS 2008 Pro上的`编译`选项卡. (2认同)

Mal*_*chi 13

多年后,与阿列克谢的回答相似,但天生支持

一个人可以制作一个Directory.Build.props类似于NuGet.Config文件的文件

https://docs.microsoft.com/en-us/visualstudio/msbuild/customize-your-build?view=vs-2019

我们的看起来像:

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

它有效地将其包含在您的 SLN 中的所有 CSPROJ 文件中。出于某种原因,通过谷歌很难找到特定的解决方案。自 MSBuild 15 以来一直存在

  • 另请注意,如果您更改这个新的全局解决方案文件中的常量,则必须卸载并重新加载每个 vs 项目,以便 VS intellisense 接受更改(但是 ms 构建将很好地接受更改) )。 (3认同)
  • MSBuild可以正确支持此功能,但即使是VS 2022也需要在编辑Directory.Build.props文件后重新启动。2年过去了,这个bug还没有修复:-( (3认同)
  • 此解决方案非常适合使用新的 SDK 样式项目格式的项目,但使用旧的非 SDK 样式项目格式的项目在使用“Directory.Build.props”时会出现问题。请参阅[.props 文件属性更改时不重新加载](https://developercommunity.visualstudio.com/content/problem/187797/props-file-properties-not-reloaded-when-changed.html) (2认同)
  • 不适用于 C# 中的 Azure SF 项目。卸载/重新加载/重建项目没有帮助。 (2认同)

Ale*_*kov 11

我知道C#项目的解决方案(我没有对其他任何项目进行测试)

例如,您有:

Project1\
Project2\
Solution1\Solution1.sln
Solution2\Solution2.sln
Run Code Online (Sandbox Code Playgroud)

SolutionDefines.targets在解决方案目录中创建文件

Project1\
Project2\
Solution1\Solution1.sln
Solution1\SolutionDefines.targets
Solution2\Solution2.sln
Solution2\SolutionDefines.targets
Solution3\Solution2.sln
Solution3\|no target file|
Run Code Online (Sandbox Code Playgroud)

在每个项目文件中添加:

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

Solution1\SolutionDefines.targets添加:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);TRACING_BUILD</DefineConstants>
    </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

Solution2\SolutionDefines.targets添加:

<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <DefineConstants>$(DefineConstants);ANOTHER_DEFINE</DefineConstants>
    </PropertyGroup>
</Project>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,您可以:

对于解决方案1-所有项目均已TRACING_BUILD添加定义

对于Solution2-所有项目均已ANOTHER_DEFINE添加定义

对于Solution3-所有项目-未添加定义

在这种方法中,必须将所有具有解决方案范围定义的解决方案存储在单独的目录中

  • 可以与另外两个信息一起使用,非常感谢!1)在“ SolutionDefines.targets”文件中,我必须声明“ &lt;Project&gt;”而没有任何属性,因此它也可以与新的“ Microsoft.NET.Sdk”项目一起使用。2)必须将include放置在项目的所有其他`&lt;DefineConstants&gt;`之后。 (2认同)
  • 这应该被标记为答案。 (2认同)
  • 最好的(也是唯一的,我猜)让东西保持干燥的方法 (2认同)
  • 由于某种原因,我需要重建项目/解决方案两次才能使“SolutionDefines.targets”中的更改生效,并且即使在重新加载解决方案后,VS intellisense 也并不总是检测到更改。 (2认同)

Jus*_*tin 5

我认为没有办法创建解决方案范围的#define。您可以为每个项目/程序集创建一个,正如其他答案所描述的那样,但如果您需要所有源代码文件来了解该 #define,则需要为解决方案中的每个项目执行此操作。