在 csproj 中标记程序集 CLSCompliant

gss*_*der 4 c# msbuild

在这个问题的回复中解释了如何InternalsVisibleTocsproj 中设置。

我认为这也适用于CLSCompliant

<ItemGroup>
    <AssemblyAttribute Include="System.CLSCompliant">
      <_Parameter1>true</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

但不是!MSBuild的抱怨true不能转换从stringbool

> 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
Run Code Online (Sandbox Code Playgroud)

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

Hak*_*tık 22

解决方案1

<ItemGroup>
    <AssemblyAttribute Include="System.CLSCompliant">
        <_Parameter1>true</_Parameter1>
        <_Parameter1_TypeName>System.Boolean</_Parameter1_TypeName>
    </AssemblyAttribute>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

解决方案2

<ItemGroup>
    <AssemblyAttribute Include="System.CLSCompliant">
        <_Parameter1>true</_Parameter1>
        <_Parameter1_IsLiteral>true</_Parameter1_IsLiteral>
    </AssemblyAttribute>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

解决方案3

来自@cremore 的评论:

如果您编写完整的类名 ,CLSCompliantAttribute即使没有附加的_Parameter1_TypeName_Parameter1_IsLiteral标签,它也可以工作。

<ItemGroup>
    <AssemblyAttribute Include="System.CLSCompliantAttribute">
        <_Parameter1>true</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

重要笔记:

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


0xc*_*ced 5

拉取请求(允许为 WriteCodeFragment 任务指定参数类型名称)最近已合并到 MSBuild 存储库中,该请求可以完全按照原始问题中的描述在 csproj 文件中标记程序集 CLSCompliant。

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

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


use*_*316 2

似乎无法在 .csproj 文件中执行此操作。
在链接的 GitHub 问题的评论中,多次提出并拒绝了多种解决方案。
唯一的解决方案是添加一个空的 csharp 文件并在其中指定程序集属性。

例如,在 ArbitraryFileName.cs 中:

using System;
[assembly: CLSCompliant(true)]
Run Code Online (Sandbox Code Playgroud)

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

  • 过时了。您可以在 .NET 6 中执行此操作 https://github.com/dotnet/msbuild/pull/6285#issuecomment-816136134 (2认同)