有没有办法在 C# 中指定“可选”MSBuild 全局 using 指令 (<Using />)?

问题描述 投票:0回答:1

我的项目拥有以下

<Using />
属性:

<ItemGroup>
    <Using Include="Maybe.NonexistenceNamespace" />
    <!-- More -->
</ItemGroup>

现在名称空间可能存在于项目中,也可能不存在。但是,如果它不存在,我会收到此编译错误(这是可以理解的)

CS0400 在全局命名空间中找不到类型或命名空间名称“也许”(是否缺少程序集引用?)

如果该命名空间不存在,是否可以告诉 C# 编译器忽略此类指令?

上下文:我在一个单独的

Import.targets
文件中有许多类似的指令,该文件被许多(数百个)项目重复使用。使用
<Import />
将它们导入到最终的生产项目中。少数名称空间丢失的情况很少见,但确实有一些。不幸的是,丢失的命名空间不是唯一的(这个项目可能会丢失这些命名空间,其他项目可能会丢失其他一些命名空间)

现在我使用的解决方法是将

<Using Remove="..."/>
添加到这些项目中,但这很难管理:

<Using Remove="Maybe.NonexistenceNamespace"/>
c# msbuild namespaces csproj
1个回答
0
投票

如果未引用提供命名空间的程序集,则

using
语句将导致 CS0400 错误。您可以禁用 CS0400 错误,但这会适得其反。您想知道参考何时丢失。

问题似乎在于您正在应用所有可能的

using
语句,但并非每个项目都使用每个程序集。

一个给定的程序集可以有多个命名空间,并且命名空间名称和程序集名称之间可能没有关系。

引用的程序集通常通过

ProjectReference
PackageReference
添加。不太常见的是,可能有直接的
Reference

引用和使用可能应该设置在一起,例如:

  <ItemGroup Condition="'$(UseMaybeNonexistenceNamespace)' != ''">
    <PackageReference Include="Maybe.NonexistenceNamespace" />
    <Using Include="Maybe.NonexistenceNamespace" />
  </ItemGroup>

如果您的

Import.targets
文件中有类似上述的代码,则项目可以在
$(UseMaybeNonexistenceNamespace)
Import
之前设置
Import.targets
属性,以添加
PackageReference
和全局
Using

这仍然不能完全消除管理问题,但我建议“管理问题”是拥有供全局使用的全局文件所固有的。对于给定的项目,参考文献通常不会经常更改。如果每个项目管理自己的引用和使用,并且没有全局文件,那么就不会存在全局文件的协调问题。

© www.soinside.com 2019 - 2024. All rights reserved.