确定是否从同一程序集中调用代码

时间:2012-05-02 13:17:01

标签: c# reflection .net-assembly internal

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

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

所以它的情况如下:

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

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

所以2A级不能叫2B级。但是1A类可以称为2A类或2B类。

3 个答案:

答案 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
}

虽然看起来很奇怪但是......