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