【问题标题】:A tool to allow protected AND internal?允许受保护和内部的工具?
【发布时间】:2013-12-15 10:25:23
【问题描述】:

这是this问题的后续。

我有一个安全敏感类 A 和使用它的包装层次结构(类 BChildOfB)。 B 必须初始化 A 的实例并允许 ChildOfB 使用它。 A 的实例应该只能BChildOfB 访问,它暴露给其他程序集并且不能是内部的

代码示例:

// ************* Library assembly *************
internal class A {}

public abstract class B
{
    // compiler error: Inconsistent accessibility: property type 
    // 'Library.A' is less accessible than property 'Library.B.Property'    
    protected A Property { get; private set; }
}

public sealed class ChildOfB : B
{
    public ChildOfB()
    {
        Console.WriteLine(Property);
    }
}


// ************* in some other assembly *************
var wrapper = new ChildOfB();

据我所知,在纯 C# 中没有办法做到这一点。 我可以接受使用外部工具的解决方案,它可能会在编译后修改 dll(例如基于某些属性)。例如,在我的代码中,属性将是 internal 而不是 protected,并且在编译后,此工具可能会更改 CLR 类型定义以包含缺少的标志(结果应该具有系列和程序集访问修饰符)。如果这个工具能确保更改属性的访问修饰符不会破坏初始 dll 中的任何代码,那就太好了。

【问题讨论】:

  • protectedinternal可访问性 修饰符。它们与安全性完全无关。
  • 我添加了security sensitive 部分只是为了避免人们建议“公开所有内容,不要打扰”
  • 这完全被误导了。工具有什么用?任何想要拨打电话的人都不会使用该工具。查看 [InternalsVisibleTo] 属性和 StackTrace 类。
  • 我宁愿使用静态分析器来检查该类是否在程序集中的其他地方使用,以保持internal 的可见性。但我个人认为internal 的收益并不大。在某些时候,您需要依靠程序员不要做愚蠢的事情。
  • @AlexeyPolyakov,又名 DarkWalker:也许您需要合并您的帐户?

标签: c# clr access-modifiers post-build-event post-build


【解决方案1】:

如果这只是为了防止意外错误,而不是为了安全,您可以使用静态分析器来强制执行此规则。将可见性设置为 internal 并让分析器在以您不喜欢的方式使用这些类时发出警告/错误。

【讨论】:

    【解决方案2】:

    从 C# 7.2 开始,有一个构造 private protected (link) 可以完成这项工作。

    【讨论】:

      猜你喜欢
      • 2019-03-23
      • 2012-03-27
      • 2019-04-28
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 2011-03-11
      • 2014-02-11
      • 2015-11-03
      相关资源
      最近更新 更多