1

我想锁定我的程序集中的类,以阻止它们被同一程序集中的其他类调用。所以换句话说,在程序集中没有横向调用。

我打算在类调用中编写一些验证,以确保它们不是从同一个程序集中调用的。如何使用反射来确定这一点?

所以它是以下场景:

Assembly1
----------
Class 1A

Assembly2
----------
Class 2A
Class 2B

所以 2A 类不能调用 2B 类。但是 1A 类可以调用 2A 类或 2B 类。

4

3 回答 3

2

使用现有的访问修饰符是不可能的。

你不能让一个类对其他程序集公开,但在内部是私有的。

如果您将您的组件拆分Class2B为不同的程序集并制作它internal,您也可以将其设置InternalsVisibleToAttributeAssembly1.

这将实现的是Class2A无法访问它,但Class1A可以。


您也可以使用反射进行一些运行时检查 - 正如Christian.K 详细信息的答案

于 2012-05-02T13:18:53.733 回答
1

为什么首先将它们放在同一个程序集中?

而是将 2B 和 2A 放在自己的程序集中,将类标记为internal. 提供程序集级属性InternalsVisibleTo以允许“Assembly1”分别访问“Assembly2B”和“Assembly2A”的内部。

使用反射,您仍然可以规避这一点。

无论如何,出于安全目的使用这种机制(或任何其他机制,手工制作的“调用者检查”,等等)都是不可取的。如果您想出于“架构”目的这样做,您可以使用上面的建议,并可能使用NDepend或自定义 FxCop/CodeAnalysis 规则等工具。您可以验证您的规则在构建期间没有被破坏。

于 2012-05-02T13:21:55.293 回答
0

怎么样:

if (Assembly.GetCallingAssembly() == Assembly.GetExecutingAssembly())
{
    // Throw some exception
}

不过,这似乎是一件很奇怪的事情……

于 2012-05-02T13:21:32.577 回答