InternalsVisibleTo 的用法
内容提要
本文介绍了在.NET中使用InternalsVisibleTo的方法。从.NET 5开始,可以在项目文件中声明InternalsVisibleTo,然后在构建时会生成[assembly:InternalsVisibleToAttribute]。可以使用PublicKey来配置,也可以使用PublicKey property来简化配置。从.NET 7开始,可以使用PublicKey代替Key。InternalsVisibleTo的实现基于.NET Core中的AssemblyAttribute。
延伸解读
项目文件配置的版本要求
从 .NET 5 开始,可以在项目文件(.csproj)或属性文件(.props/.targets)中直接声明 InternalsVisibleTo 项,构建时会自动生成 [assembly:InternalsVisibleToAttribute]。这简化了以往需要在代码中手动添加特性的方式,但需注意项目需面向 .NET 5 或更高版本。
PublicKey 配置的简化技巧
当需要指定公钥时,除了在 Include 中直接附加 PublicKey 或使用 Key 属性外,还可以在 PropertyGroup 中定义 PublicKey 属性,然后在 InternalsVisibleTo 中引用。这种方式尤其适合多个 InternalsVisibleTo 项共享同一公钥的场景,避免重复配置长字符串,提升可读性和维护性。
从 .NET 7 开始的命名改进
在 .NET 7 及更高版本中,可以使用 PublicKey 属性替代 Key 属性来指定公钥,这更符合命名规范,使配置意图更清晰。如果项目已升级到 .NET 7,建议采用新属性,以保持代码的现代性和一致性。
Q&A
从哪个 .NET 版本开始可以在项目文件中声明 InternalsVisibleTo?
从 .NET 5 开始,可以在项目文件(如 .csproj)或属性文件(.props/targets)中声明 InternalsVisibleTo,构建时会自动生成 [assembly:InternalsVisibleToAttribute]。
如何在项目文件中配置 InternalsVisibleTo 并指定公钥?
有三种方式:1) 直接在 Include 中写 "UnitTest, PublicKey=xxxxx";2) 使用 Key 属性:<InternalsVisibleTo Include="UnitTest" Key="xxxxx" />;3) 定义 <PublicKey> 属性,然后在 InternalsVisibleTo 中只写程序集名。
使用 PublicKey 属性配置有什么好处?
PublicKey 通常很长,难以阅读。通过定义 <PublicKey> 属性,只需配置一次,就可以在多个 InternalsVisibleTo 中复用,大大简化配置,特别适合有多个 InternalsVisibleTo 的项目。
从 .NET 7 开始,InternalsVisibleTo 的配置有什么变化?
从 .NET 7 开始,可以使用 PublicKey 代替 Key,例如 <InternalsVisibleTo Include="UnitTest" PublicKey="xxxxx" />,这更符合 public key 的命名规范。
InternalsVisibleTo 在构建时是如何实现的?
InternalsVisibleTo 的实现基于 .NET Core 中的 AssemblyAttribute,最终会生成 assembly:InternalsVisibleTo attribute。
在项目文件中声明 InternalsVisibleTo 后,编译结果是什么?
编译后会生成 [assembly:InternalsVisibleToAttribute],可以通过反编译查看。