【问题标题】:How to specify a '|net35|net40|net45|'.Contains($(TargetFramework)) condition for an ItemGroup (*.csproj)?如何为 ItemGroup (*.csproj) 指定 '|net35|net40|net45|'.Contains($(TargetFramework)) 条件?
【发布时间】:2021-08-04 04:18:41
【问题描述】:

我有一个具有多目标的 C# (SDK) 项目,我必须仅在一些较旧的框架版本中包含某个文件,我可以像这样轻松实现它:

<ItemGroup Condition="('$(TargetFramework)'=='net35') Or ('$(TargetFramework)'=='net40') Or ('$(TargetFramework)'=='net45') Or ('$(TargetFramework)'=='net451') Or ('$(TargetFramework)'=='net452')">
  <!-- do something -->
</ItemGroup>

但这看起来有点笨拙并且不容易阅读,所以我尝试这样做(以及它的数十种变体)但没有任何成功:

<ItemGroup Condition="'|net35|net40|net403|net45|net451|net452|'.Contains('|$(TargetFramework)|')">
  <!-- do something -->
</ItemGroup>

有没有办法用字符串包含操作来做到这一点?

我查看了这样的帖子:Is there any MSbuild task to check if a string contains another string (similar to string.contains),但他们在那里所做的似乎对我不起作用。

我使用的版本是 Visual Studio 2019 (16.9.4)

【问题讨论】:

    标签: visual-studio msbuild csproj


    【解决方案1】:

    您似乎不能直接在字符串文字上调用实例字符串函数。 The MSBuild documentation 建议只能在属性上调用实例方法。

    通过将您当前内联的值移动到自定义属性中,您可以使用该属性的 Contains 方法,如下所示:

        <PropertyGroup>
            <Frameworks>|net35|net40|net403|net45|net451|net452|</Frameworks>
        </PropertyGroup>
    
        <ItemGroup Condition="$(Frameworks.Contains('|$(TargetFramework)|'))">
            <!-- do something -->
        </ItemGroup>
    

    【讨论】:

    • 完美,谢谢。我更正了 contains 表达式以包括前导和尾随管道。
    猜你喜欢
    • 1970-01-01
    • 2017-04-03
    • 2021-05-19
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 2012-10-12
    • 1970-01-01
    相关资源
    最近更新 更多