그냥 이상한 일 내가 호기심에서 뭔가 다른 것을 확인하기 위해 모든 유형을 반성하는 것을 발견했을 때.왜 System .__ ComObject 유형이 (때로는) public이 아닌지 주장합니다.
mscorlib.dll
(종종?)의 클래스 System.__ComObject
은 실제로 그것이 비공개 인 것으로 보이는 경우 공개로 주장하는 이유는 무엇입니까? 간단한 C# 콘솔 응용 프로그램에서 다음 코드를 실행하면
var t = Type.GetType("System.__ComObject");
Console.WriteLine(t.IsPublic); // "True" ?!
Console.WriteLine(t.IsVisible); // "False"
출력이 충돌하는 것처럼 보입니다. 중첩되지 않은 유형 (t.IsNested
이 false 인 경우)은 IsPublic
및 IsVisible
에 대해 동일한 진리 값을 제공해야합니다. 내가 IL DASM
와 어셈블리를 볼 때 난을 참조하십시오
namespace System
{
// not public
internal class __ComObject : MarshalByRefObject
{
...
}
}
:
.class private auto ansi beforefieldinit System.__ComObject
extends System.MarshalByRefObject
{
} // end of class System.__ComObject
나에게, 대단히 비공개 클래스처럼 아래 C# 코드에 해당하는 무언가를 보이는,
내가 다른, System.__Canon
을 비슷한 이름을 가진 유형 및 유사 IL 수정 비교, 예상대로 거짓 모두 IsPublic
및 IsVisible
돌아갑니다. Type.GetType("System.__ComObject").IsPublic
사실 제공하는 이유 (때)
는 아는 사람 있나요? __ComObject
의
시스템 .__ ComObject 및 System .__ Canon은 매우 다릅니다. 첫 번째는 COM 개체 (IsCOMObject == true)입니다. 이것이 내가 공용이라고 생각하는 이유입니다. –
@Mihail'var t = typeof (Uri) .Assembly.GetType ("System.Net.Mail.MSAdminBase");''IsCOMObject'가 아니라'IsNotPublic' 인 또 다른 유형의't'가 있습니다. 이것은 어셈블리에 의존하지 않는 한 그 설명에 대한 "반례문"인 것처럼 보입니다 ('System.Net.Mail.MSAdminBase'는'System .__ ComObject'와 비교하여 다른 어셈블리에 있습니다). –
내가 알아낼 수있는 것은 결함 일 수 있다는 것입니다! 나는 비슷한 물건들을 발견했는데, 너희들도 똑같이 나타 났을지도 모른다. [link] (http://microsoft.public.dotnet.framework.interop.narkive.com/06Y4MWuX/reflection-messing-up-the-type-hierarchy)를 따르십시오. – Nilesh