在哪里放入InternalsVisibleTo

Ber*_*ryl 2 c# assemblies visual-studio

与此问题相关的是,AssemblyInfo的生成如何工作?

我一直在放入InternalsVisibleTo程序集的第一类文件,我意识到它会很有用.使用其他程序集属性在AssemblyInfo中似乎更合适,但我不希望它被无意中覆盖.

那么,它应该去哪里?

Mus*_*tin 43

现在是 2022 年,随着SDK 式项目的引入,放置该InternalsVisibleTo属性的另一个选项是项目文件。将以下行添加到您的*.csproj文件中:

<ItemGroup>
  <InternalsVisibleTo Include="ProjectName.Tests" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

另一种有用的情况是使用参数化项目名称,如下所示:

<ItemGroup>
    <AssemblyAttribute Include="System.Runtime.CompilerServices.InternalsVisibleTo">
      <_Parameter1>$(MSBuildProjectName).Tests</_Parameter1>
    </AssemblyAttribute>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

不确定,但我假设您可以在 .NET 5+ 中使用此功能。

最后,我同意@Tim Lloyd 的观点。将InternalsVisibleTo属性放在程序集中的中心位置(在程序集中AssemblyInfo.cs或项目文件中)可提高可发现性,最终这是程序集级属性。

  • 确实如此,但在 SO 中通过新功能或 API 提供最新或更实用的方法并不罕见。例如,您可以在原始问题几年后看到大量答案,这些答案通过 C# 异步功能的介绍重新得到解答。最终,这个问题仍然相关,.NET 5+ 使用InternalsVisibleTo 属性的方式是将其放入项目文件中。(并且无需创建 AssemblyInfo.cs 类。) (18认同)
  • 这是一个很好的迹象,表明在大约半年的时间里,这个答案赶上了已接受答案的得票数。虽然这个答案仍然绝对有效,但我们一直在寻找更优雅、更现代的做事方式。 (3认同)
  • 不需要 `&lt;AssemblyAttribute/&gt;`,您可以使用 `&lt;InternalsVisibleTo Include="$(MSBuildProjectName).Tests" /&gt;` (2认同)

Tim*_*oyd 10

程序集级别属性可以出现在任何代码文件中,但是,按照惯例,它们放在AssemblyInfo文件中.这有助于发现,因为这是人们(或工具)在调查问题时通常会看到的地方.

我已经使用InternalsVisibleTo多年并将其放在AssemblyInfo文件中.我从来不知道它会被Visual Studio(所有版本)等工具覆盖.


小智 5

AssemblyInfo 实际上只是组织程序集范围属性的一种方式。

您没有理由不能将所有代码放入一个巨大的 .cs 文件中,并将其传递给 MSBuild。您将得到相同的最终结果。

我有理由拥有多个 AssemblyInfo 文件 - AssemblyInfo.cs 特定于每个程序集,但 CommonAssemblyInfo 在许多程序集之间共享,并且包含由构建系统生成的版本号等内容。