好奇心から他の何かをチェックするためにすべてのタイプを熟考していたときに、たまたま発見した奇妙なことです.
実際には非公開のように見えるのにSystem.__ComObject
、アセンブリのクラスが (時々?) 公開されていると主張するのはなぜですか? mscorlib.dll
シンプルな C# コンソール アプリケーションで次のコードを実行すると:
var t = Type.GetType("System.__ComObject");
Console.WriteLine(t.IsPublic); // "True" ?!
Console.WriteLine(t.IsVisible); // "False"
出力が矛盾しているようです。ネストされていない型 ( t.IsNested
is false) は、 と に同じ真理値を与える必要が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 修飾子の両方が期待どおりに false を返しますIsPublic
。IsVisible
なぜ(そしていつ)Type.GetType("System.__ComObject").IsPublic
真になるのか誰か知っていますか?