C# 我可以将编译常量传递给项目引用吗?

C# 我可以将编译常量传递给项目引用吗?,c#,msbuild,C#,Msbuild,如果我有一个引用,有没有办法将条件编译值传递给该项目?类似的东西(我知道不存在这样的东西,只是为了说明需要): 然后,通过在编译期间是否传递该值,我可以得到不同的输出。项目引用项允许添加元数据字段属性和未定义属性,以允许对用于构建项目引用的“全局”属性集进行计算。您可以通过如下方式将全局属性传递给引用的项目来使用此属性: public sealed class ProduceValue { public string Produce() { #if

如果我有一个
引用,有没有办法将条件编译值传递给该项目?类似的东西(我知道
不存在这样的东西,只是为了说明需要):


然后,通过在编译期间是否传递该值,我可以得到不同的输出。

项目引用项允许添加元数据字段
属性
未定义属性
,以允许对用于构建项目引用的“全局”属性集进行计算。您可以通过如下方式将全局属性传递给引用的项目来使用此属性:

    public sealed class ProduceValue
    {
        public string Produce()
        {
#if WAS_SET
            return "WAS SET";
#else
            return "NOTHING WAS SET";
#endif
        }
    }
<ProjectReference Include="..\DataProducer\DataProducer.csproj">
  <Properties>DefineConstants=WAS_SET</Properties>
<ProjectReference>

DefineConstants=已设置

这现在是引用项目的全局属性,其效果是它将覆盖项目中静态定义的
DefineConstants
的任何定义/更新-这还可能包括任何添加的配置常量(
DEBUG
)。

我认为可能的原因是“ProjectReference”的“Targets”

在DataProducer.csproj中定义一个目标。 在目标中定义Constants属性。 因此,在构建目标之前先创建目标

那么它应该有效吗

更新

尝试了我的上一个选项,它不起作用。 另一种选择:

  • 复制DataProducer.csproj并重命名为DataProducer.WAS_SET.csproj
  • 为DataProducer.WAS\u SET.csproj添加定义常量
  • update ProjectReference Include=“..\DataProducer\DataProducer.WAS\u SET.csproj”
  • 因此DataProducer.csproj和DataProducer.WAS_SET.csproj将共享代码。 我们可以参考任何我们想要的

    我们可以为这两个csproj使用不同的AssemblyName。
    因此,相同的源代码,但不同的dll。

    这看起来很有希望,但我尝试了你的想法,它似乎没有改变引用的项目。如果你想知道我做了什么,我已经将我的解决方案放入GitHub repo中:我可能做错了什么-如果我遗漏了什么,请告诉我。我的直觉告诉我,当你构建一个包含多个项目的完整解决方案时,增量编译肯定会有问题。。我将在几个小时后看一看,同时我建议尝试从命令行一次只构建一个项目,看看会发生什么。我同意潜在的问题。我只是想看看是否有可能:)@JasonBock你找到解决这个问题的办法了吗?
    <ProjectReference Include="..\DataProducer\DataProducer.csproj">
      <Properties>DefineConstants=WAS_SET</Properties>
    <ProjectReference>