【问题标题】:Determine if code is called from within the same assembly确定是否从同一程序集中调用代码
【发布时间】:2012-05-02 13:17:01
【问题描述】:

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

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

所以它是以下场景:

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

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

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

【问题讨论】:

  • 这不是关键字internal的用途吗?
  • 这听起来完全符合大多数要求。是否允许Class2A 调用Class1A,而后者又调用Class2B
  • @juergend - 不。它允许您访问同一程序集中的类,而不是跨程序集。它也不限制程序集中的访问。
  • @juergend - 除非 OP 多次严重输入错误,否则他们似乎正在寻找 anti-internal...

标签: c# reflection .net-assembly internal


【解决方案1】:

现有的access modifiers 无法满足您的要求。

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

如果您将Class2B 拆分为不同的程序集并使其成为internal,您也可以将set the InternalsVisibleToAttribute 拆分为Assembly1

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


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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      怎么样:

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

      这似乎是一件很奇怪的事情......

      【讨论】:

        猜你喜欢
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-28
        相关资源
        最近更新 更多