Visual Studio 2017新版.csproj InternalsVisibleTo

Luk*_*uka 42 msbuild csproj assemblyinfo visual-studio-2017

在新的Visual Studio 2017 .csproj项目文件中从AssemblyInfo放置InternalsVisibleTo的位置?

Iva*_*uba 110

以防万一有人想放在InternalsVisibleTo一个.csproj文件而不是AssemblyInfo.cs(可能的情况是在测试项目和测试项目之间有一个命名约定),你可以这样做:

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

拥有此代码将生成以下代码

[assembly: System.Runtime.CompilerServices.InternalsVisibleTo("MyProject.Test")]
Run Code Online (Sandbox Code Playgroud)

内部自动生成的AssemblyInfo.cs(例如,用于调试配置和.NET Standard 2.0目标)

/obj/Debug/netstandard2.0/MyProject.AssemblyInfo.cs
Run Code Online (Sandbox Code Playgroud)

  • 这种技术非常有用.如果您有多个项目,则可以在解决方案根目录中使用`directory.build.props`文件,并将其应用于所有项目. (13认同)
  • 这应该是接受的答案,因为问题表明将InternalsVisibleTo添加到.csproj文件中. (5认同)
  • 如果项目名称与程序集不同,则($ MSBuildProjectName)的替代方法是$(AssemblyName)。 (3认同)
  • 这可能是显而易见的,但是如果您将“ GenerateAssemblyVersionAttribute”设置为“ false”,则将无法正常工作可能毫无价值。 (2认同)

小智 28

要澄清上面的Hans Passant的评论,您只需将InternalsVisibleTo添加到项目中的任何cs文件中.例如,我在项目的根目录中创建了一个AssemblyInfo.cs文件,然后添加了以下内容(仅限):

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo("DynamicProxyGenAssembly2, PublicKey=<ADD_KEY_HERE>")]
Run Code Online (Sandbox Code Playgroud)


Alv*_* RC 17

从 .NET 5 开始,这实际上一旦添加到您的csproj

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

关于此功能的工作和讨论可以在 dotnet 的 GitHub 存储库上的这个 PR上看到。