如何隐藏常用程序集类?

How to hide common assembly classes?

我正在开发一个分成多个项目的软件,您可以将其视为:

客户端和服务器都引用 Common,并从中使用 类。因此,Common 中的 类 为 public。但是,虽然我希望它们被客户端和服务器使用,但我不希望它们被使用客户端和服务器库的外部代码使用。

将 类 标记为内部显然不是一种选择。有没有一种方法可以使它们对客户端和服务器可用,但对外界隐藏它们?

你取消了 internal 的资格,因为你假设你的另一个 Assemblies 将无法使用 internal Types,这不一定是真的。

InternalsVisibleToAttibute 是一个 Assembly Attribute,它允许您使一个项目的 internal Types 对其他选定项目可见。

通过这种方式,您可以创建通用类型 internal,但使用此 Attribute 可使它们对 ServerClient.

[assembly:InternalsVisibleTo("Client", "PublicKey=2345456456...")]
[assembly:InternalsVisibleTo("Server", "PublicKey=5345347366...")]

在我看来,internal 通常有点代码味道......它并没有真正保护你的代码,而是让以后更难扩展......我会只需保留 Types public 并使用 XML 文档即可确保使用我的 Types 的人会按照我的意思使用它们,但这只是我的观点...

您可以在 Common 程序集中使用 internal 类 和 InternalsVisibleToAttribute。将属性添加到 Common 项目的 AssemblyInfo 并指定将有权访问其 internal 的程序集。

[assembly:InternalsVisibleTo("Client")]
[assembly:InternalsVisibleTo("Server")]

尽管我只会制作类型 public

除属性 InternalsVisibleTo 之外的另一个选项是将 Common 项目创建为共享项目(在 VS 2015 中可用),这样 ClientServer 将具有访问内部 类 因为共享项目将包含在每个项目的程序集中,而不是像 Class 库那样移动到单独的程序集中。