20

好奇心から他の何かをチェックするためにすべてのタイプを熟考していたときに、たまたま発見した奇妙なことです.

実際には非公開のように見えるのにSystem.__ComObject、アセンブリのクラスが (時々?) 公開されていると主張するのはなぜですか? mscorlib.dllシンプルな C# コンソール アプリケーションで次のコードを実行すると:

var t = Type.GetType("System.__ComObject");
Console.WriteLine(t.IsPublic);   // "True"   ?!
Console.WriteLine(t.IsVisible);  // "False"

出力が矛盾しているようです。ネストされていない型 ( t.IsNestedis 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 を返しますIsPublicIsVisible

なぜ(そしていつ)Type.GetType("System.__ComObject").IsPublic真になるのか誰か知っていますか?

4

1 に答える 1