【问题标题】:Mark an assembly CLSCompliant in csproj在 csproj 中标记程序集 CLSCompliant
【发布时间】:2020-05-12 14:06:08
【问题描述】:

在这个question的回复中解释了如何在csproj中设置InternalsVisibleTo

我认为这也适用于CLSCompliant

<ItemGroup>
    <AssemblyAttribute Include="System.CLSCompliant">
      <_Parameter1>true</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>

但不是! MSBuild 抱怨true 无法从string 转换为bool

> dotnet build
Microsoft (R) Build Engine version 16.4.0+e901037fe for .NET Core
Copyright (C) Microsoft Corporation. All rights reserved.

  Restore completed in 418.35 ms for C:\Users\coder\OneDrive\Projects\pickall\src\PickAll.Sample\PickAll.Sample.csproj.
  Restore completed in 418.33 ms for C:\Users\coder\OneDrive\Projects\pickall\src\PickAll.Specs\PickAll.Specs.csproj.
  Restore completed in 418.33 ms for C:\Users\coder\OneDrive\Projects\pickall\src\PickAll\PickAll.csproj.
obj\Debug\netstandard2.0\PickAll.AssemblyInfo.cs(14,32): error CS1503: Argument 1: cannot convert from 'string' to 'bool' [C:\Users\coder\OneDrive\Projects\pickall\src\PickAll\PickAll.csproj]
obj\Debug\net461\PickAll.AssemblyInfo.cs(14,32): error CS1503: Argument 1: cannot convert from 'string' to 'bool' [C:\Users\coder\OneDrive\Projects\pickall\src\PickAll\PickAll.csproj]

Build FAILED.

obj\Debug\netstandard2.0\PickAll.AssemblyInfo.cs(14,32): error CS1503: Argument 1: cannot convert from 'string' to 'bool' [C:\Users\coder\OneDrive\Projects\pickall\src\PickAll\PickAll.csproj]
obj\Debug\net461\PickAll.AssemblyInfo.cs(14,32): error CS1503: Argument 1: cannot convert from 'string' to 'bool' [C:\Users\coder\OneDrive\Projects\pickall\src\PickAll\PickAll.csproj]
    0 Warning(s)
    2 Error(s)

Time Elapsed 00:00:18.37

有没有办法在_Parameter1 标签内正确写入布尔文字

【问题讨论】:

  • 你只展示了你所做工作的一半——你还没有展示你尝试与项目文件一起使用的 C# 代码。
  • 项目为:github.com/gsscoder/pickall。如果我通过代码设置CLSCompliant,编译成功。如果不是来自 OmniSharp VSCode 扩展,我不会收到警告。它对引用 AngleSharp 的代码不满意。我想是因为它没有标记为CLSCompliant(true)
  • 项目链接不如minimal reproducible example在问题中有用。 (我还建议您暂时将您的机器设置为英文,以便您可以发布英文错误消息。)
  • 嗨,@JonSkeet。我已编辑问题以 English 发布 MSBuild 输出。 (说实话,我不知道我以前为什么不这样做,我讨厌在其他语言中使用 UI)。我还使用修改后的 csproj 创建了一个gist。其余的存储库可以从 GitHub 克隆。如果您还需要什么,请告诉我。感谢您的宝贵时间!
  • "可以从 GitHub 克隆存储库的其余部分。"现在,是的。不一定在10年后,这个问题可能仍然存在。或者在 10 年后它可能看起来完全不同。毫无疑问,只是演示此问题所需的代码更多。为了使这个问题对试图回答的人以及阅读问题以便以后从中受益的人尽可能有用,请在问题中添加minimal reproducible example

标签: c# msbuild


【解决方案1】:

.csproj 文件中的 appears that there is no way to do this。在链接的 GitHub 问题的 cmets 中,多次提出并拒绝了几种解决方案。唯一的解决方案是添加一个空的 csharp 文件并在其中指定程序集属性。

例如,在 ArbitraryFileName.cs 中:

using System;
[assembly: CLSCompliant(true)]

您可能应该将此文件命名为 AssemblyInfo.cs,但实际上名称并不重要。

【讨论】:

    【解决方案2】:

    最近在 MSBuild 存储库中合并了一个拉取请求 (Allow parameter type name to be specified for WriteCodeFragment task),它可以完全按照您原始问题中的描述在 csproj 文件中标记程序集 CLSCompliant。

    在 16.10 预览版 3 中应该是 available soon(2021 年 5 月)(不确定是指 MSBuild 版本还是 Visual Studio 版本)。从提到的拉取请求 cmets 中引用用户 Forgind:

    这应该在 16.10 预览版 3 中可用。当可用时,我会尽量记住在此线程中 ping 你。那应该是大约一个月后。

    【讨论】:

      【解决方案3】:

      解决方案 1

      <ItemGroup>
          <AssemblyAttribute Include="System.CLSCompliant">
              <_Parameter1>true</_Parameter1>
              <_Parameter1_TypeName>System.Boolean</_Parameter1_TypeName>
          </AssemblyAttribute>
      </ItemGroup>
      

      解决方案 2

      <ItemGroup>
          <AssemblyAttribute Include="System.CLSCompliant">
              <_Parameter1>true</_Parameter1>
              <_Parameter1_IsLiteral>true</_Parameter1_IsLiteral>
          </AssemblyAttribute>
      </ItemGroup>
      

      重要说明:

      1. 我正在使用 .NET 6 和 VS2022
      2. 如果这对您不起作用,请尝试更新 Visual Studio(这是新添加的功能)

      【讨论】:

      • 感谢 Hakan,我认为它也值得对以前的 .NET 版本进行测试
      猜你喜欢
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 2013-03-17
      • 2019-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多