我有两个程序集,A.dll 和 B.dll。A.dll 有一些共同的特点,B.dll 使用它。我最终必须为其他用户分发 A.dll 和 B.dll。
但是,我将 A.dll 中的一些方法标记为公共(供 B.dll 使用),但我不希望其他人使用它们。
有没有好的方法来实现这一目标?是使用InternalsVisibleToAttribute
一个好的做法来实现这一点吗?
我有两个程序集,A.dll 和 B.dll。A.dll 有一些共同的特点,B.dll 使用它。我最终必须为其他用户分发 A.dll 和 B.dll。
但是,我将 A.dll 中的一些方法标记为公共(供 B.dll 使用),但我不希望其他人使用它们。
有没有好的方法来实现这一目标?是使用InternalsVisibleToAttribute
一个好的做法来实现这一点吗?
在 A.dll 中将项目标记为内部并添加以下程序集属性
using System.Runtime.CompilerServices;
[assembly: InternalsVisibleTo( "B" )]
但请注意,您仍然可以通过反射访问内部内容,因此它不是 100% 密封的。
该InternalsVisibleToAttribute
属性是执行此操作的一种方法,但您必须意识到它将所有内部结构暴露给另一个程序集。
另请注意,如果您不使用已签名的程序集,则将允许从具有该名称的任何InternalsVisibleToAttribute
程序集访问内部。这可能是不可取的。
另一种选择是使用工具将所需代码从程序集“A”注入程序集“B”。这将允许“B”独立运行而无需访问内部。这取决于您的程序集是如何使用的,这是否是一个理想的解决方案。
最后,您可以使用反射访问程序集“A”中的代码。这有点繁琐,但如果你只需要几件事,它可能就足够了。这也将允许您在程序集“B”存在但缺少 A 时提供良好的后备或错误处理。
正如其他人所指出的那样,反射可以提供对内部或不内部程序集中任何内容的访问。如果你需要保护你的代码,你应该考虑混淆。
InternalsVisibleTo
是要走的路。
你的问题的标题起初有点令人困惑,但在阅读之后很明显你想要的是让特定程序集可以访问一些internal
(不是)成员。 public