如何让“公众”v / s“内部公众”?

时间:2012-07-25 13:40:17

标签: c# internalsvisibleto

  

可能重复:
  When should [assembly: InternalsVisibleTo()] be used?
  Access to dll methods

我有两个组件,A.dll和B.dll。 A.dll有一些共同的功能,而B.dll使用它。我最终必须为其他用户分发A.dll和B.dll。

但是,A.dll中有一些方法我将其标记为公开(供B.dll使用),但我不希望其他人使用它们。

有没有很好的方法来实现这一目标?使用InternalsVisibleToAttribute是一种很好的做法吗?

3 个答案:

答案 0 :(得分:9)

将项目标记为A.dll中的内部并添加以下程序集属性

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo( "B" )]

但请注意,您仍然可以通过反射访问内部资料,因此不会100%密封。

答案 1 :(得分:1)

InternalsVisibleTo是要走的路。

您的问题的标题起初有点令人困惑,但在阅读后很明显,您想要的是拥有一些internal public)成员可由特定组件访问。

答案 2 :(得分:1)

InternalsVisibleToAttribute属性是实现此目的的一种方法,但您必须意识到它将所有内部结构暴露给另一个程序集。

另请注意,如果您未使用已签名的程序集,则InternalsVisibleToAttribute将允许使用该名称访问任何程序集的内部组件。这可能并不可取。

另一种选择可能是使用工具将组件“A”中所需的代码注入到组件“B”中。这将允许“B”独立运行而无需访问内部。这取决于你的组件是如何使用的,无论这是否是一个理想的解决方案。

最后,您可以使用反射访问程序集“A”中的代码。它有点繁琐,但如果只需要一些东西,那就足够了。当程序集“B”存在但A缺失时,这也允许您提供良好的后备或错误处理。

正如其他人所指出的那样,反射可以提供对内部装配中任何内容的访问。如果您需要保护您的代码,您应该考虑混淆。