【发布时间】:2013-12-15 10:25:23
【问题描述】:
这是this问题的后续。
我有一个安全敏感类 A 和使用它的包装层次结构(类 B 和 ChildOfB)。 B 必须初始化 A 的实例并允许 ChildOfB 使用它。 A 的实例应该只能被B 和ChildOfB 访问,它暴露给其他程序集并且不能是内部的。
代码示例:
// ************* 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 中的任何代码,那就太好了。
【问题讨论】:
-
protected和internal是 可访问性 修饰符。它们与安全性完全无关。 -
我添加了
security sensitive部分只是为了避免人们建议“公开所有内容,不要打扰” -
这完全被误导了。工具有什么用?任何想要拨打电话的人都不会使用该工具。查看 [InternalsVisibleTo] 属性和 StackTrace 类。
-
我宁愿使用静态分析器来检查该类是否在程序集中的其他地方使用,以保持
internal的可见性。但我个人认为internal的收益并不大。在某些时候,您需要依靠程序员不要做愚蠢的事情。 -
@AlexeyPolyakov,又名 DarkWalker:也许您需要合并您的帐户?
标签: c# clr access-modifiers post-build-event post-build