我想锁定我的程序集中的类,以阻止它们被同一程序集中的其他类调用。所以换句话说,在程序集中没有横向调用。
我打算在类调用中编写一些验证,以确保它们不是从同一个程序集中调用的。如何使用反射来确定这一点?
所以它是以下场景:
Assembly1
----------
Class 1A
Assembly2
----------
Class 2A
Class 2B
所以 2A 类不能调用 2B 类。但是 1A 类可以调用 2A 类或 2B 类。
我想锁定我的程序集中的类,以阻止它们被同一程序集中的其他类调用。所以换句话说,在程序集中没有横向调用。
我打算在类调用中编写一些验证,以确保它们不是从同一个程序集中调用的。如何使用反射来确定这一点?
所以它是以下场景:
Assembly1
----------
Class 1A
Assembly2
----------
Class 2A
Class 2B
所以 2A 类不能调用 2B 类。但是 1A 类可以调用 2A 类或 2B 类。
使用现有的访问修饰符是不可能的。
你不能让一个类对其他程序集公开,但在内部是私有的。
如果您将您的组件拆分Class2B
为不同的程序集并制作它internal
,您也可以将其设置InternalsVisibleToAttribute
为Assembly1
.
这将实现的是Class2A
无法访问它,但Class1A
可以。
您也可以使用反射进行一些运行时检查 - 正如Christian.K 详细信息的答案。
为什么首先将它们放在同一个程序集中?
而是将 2B 和 2A 放在自己的程序集中,将类标记为internal
. 提供程序集级属性InternalsVisibleTo
以允许“Assembly1”分别访问“Assembly2B”和“Assembly2A”的内部。
使用反射,您仍然可以规避这一点。
无论如何,出于安全目的使用这种机制(或任何其他机制,手工制作的“调用者检查”,等等)都是不可取的。如果您想出于“架构”目的这样做,您可以使用上面的建议,并可能使用NDepend或自定义 FxCop/CodeAnalysis 规则等工具。您可以验证您的规则在构建期间没有被破坏。
怎么样:
if (Assembly.GetCallingAssembly() == Assembly.GetExecutingAssembly())
{
// Throw some exception
}
不过,这似乎是一件很奇怪的事情……