是否有限制解决方案的访问修饰符?

Is there an access modifier that limits to a solution?

在我的 .NET 解决方案中,我有两个项目:一个主项目和一个针对主项目进行 运行ning 测试的项目。在我的项目中,我有几个方法我想保留 "private",但也想 运行 测试。是否有一种访问方法可以将这些功能限制在我的解决方案内部?

您正在查找 InternalsVisibleTo 属性。

此属性允许您指定其他程序集,这些程序集应有权访问程序集内部的类型和方法。因此,在您的主项目 AssemblyInfo.cs 文件(或任何其他源文件)中,您可以指定您的测试项目是 'friend assembly' 并且应该可以访问主项目的内部结构:

[assembly:InternalsVisibleTo("MainProject.Tests")]

附带一提,正如 Alexei 所指出的,如果您的 MainProject 使用强名称密钥签名,则任何 'friend' 程序集也必须签名。这是解释here

虽然,正如另一条评论中提到的。最佳做法是使用 public API.

来测试您的程序集

您可以使用 InternalsVisibleTo 属性使 internal 类型和方法对所选程序集可见。

但是,您应该尝试设计您的 API 以便仅使用 public 界面即可对其进行测试。

您应该认真回想一下您的解决方案的架构。这种气味通常表明您的 class 一次做了太多事情。

一个简单的解决方法是将此职责(那些私有方法)提取到另一个 class,然后它们变成 public 并且可以开箱即用地测试...

不,无法限制对 "just solution" 的访问。

原因是解决方案只是一组项目。一个项目可以有任意数量的解决方案。因此,即使您 "limit" 访问一个解决方案中包含的项目 you/someone 其他人也可以创建另一个解决方案,该解决方案将需要以某种方式神奇地访问方法。

额外构建的程序集不包含任何关于它是哪个解决方案的一部分的信息 - 因此在 运行 时间没有信息来检查访问。


针对您的特定问题 - InternalsVisibleTo(如 所示)将为您允许的项目提供内部方法的访问权限(需要强签名的程序集)或重构您的代码以避免需要测试私有方法。