2

可能重复:
何时应使用 [assembly: InternalsVisibleTo()]?
访问 dll 方法

我有两个程序集,A.dll 和 B.dll。A.dll 有一些共同的特点,B.dll 使用它。我最终必须为其他用户分发 A.dll 和 B.dll。

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

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

4

3 回答 3

9

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

using System.Runtime.CompilerServices;

[assembly: InternalsVisibleTo( "B" )]

但请注意,您仍然可以通过反射访问内部内容,因此它不是 100% 密封的。

于 2012-07-25T13:42:32.303 回答
1

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

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

另一种选择是使用工具将所需代码从程序集“A”注入程序集“B”。这将允许“B”独立运行而无需访问内部。这取决于您的程序集是如何使用的,这是否是一个理想的解决方案。

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

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

于 2012-07-25T13:51:44.967 回答
1

InternalsVisibleTo是要走的路。

你的问题的标题起初有点令人困惑,但在阅读之后很明显你想要的是让特定程序集可以访问一些internal不是)成员。 public

于 2012-07-25T13:43:04.987 回答