【发布时间】:2023-03-26 15:40:01
【问题描述】:
当我出于好奇对所有类型进行反思以检查其他内容时,碰巧发现了一个奇怪的现象。
为什么程序集mscorlib.dll 的类System.__ComObject(有时?)声称是公开的,而实际上它似乎是非公开的?如果我在一个简单的 C# 控制台应用程序中运行以下代码:
var t = Type.GetType("System.__ComObject");
Console.WriteLine(t.IsPublic); // "True" ?!
Console.WriteLine(t.IsVisible); // "False"
输出似乎有冲突。非嵌套类型(t.IsNested 为假)应该为IsPublic 和IsVisible 提供相同的真值。当我使用IL DASM 查看程序集时,我看到了:
.class private auto ansi beforefieldinit System.__ComObject
extends System.MarshalByRefObject
{
} // end of class System.__ComObject
在我看来,它看起来很像一个 非公共 类,它对应于下面的 C# 代码:
namespace System
{
// not public
internal class __ComObject : MarshalByRefObject
{
...
}
}
当我与另一个具有相似名称 System.__Canon 和相似 IL 修饰符的类型进行比较时,IsPublic 和 IsVisible 都按预期返回 false。
有人知道为什么(以及何时)Type.GetType("System.__ComObject").IsPublic 给出了 true 吗?
【问题讨论】:
-
System.__ComObject 和 System.__Canon 非常不同 - 第一个是 COM 对象(IsCOMObject==true) - 这就是为什么我认为它是 Public 而第二个不是。
-
@Mihail 如果我使用
var t = typeof(Uri).Assembly.GetType("System.Net.Mail.MSAdminBase");,我还有另一种类型t,它也是IsCOMObject,但IsNotPublic。所以这似乎是该解释的“反例”,除非这取决于程序集(System.Net.Mail.MSAdminBase在另一个程序集中,与System.__ComObject相比)。 -
我所能想到的是,这可能是一个缺陷!我遇到了一些类似的东西,可能你们也遇到了同样的事情。关注link
-
@Nilesh 看起来该链接描述了相同的问题(或包含我的问题和其他问题的问题)。不幸的是,那里没有解释。这种情况似乎六年都没有改变。如果它是一个错误,那就太奇怪了。但是一个非常有趣的评论!
-
祝贺 Noseratio 在赏金到期后,他的回答自动给了他一些声誉。但是,我仍然觉得我的答案没有得到答复。从技术上讲,
IsPublic通过调用抽象GetAttributeFlagsImpl起作用,但这并不能帮助我理解__ComObject的特别之处。我不知道这种行为是必要的和设计的,还是一个错误,我不知道为什么__ComObject与这里的其他类型不同会很有趣。
标签: c# .net reflection encapsulation cil