Chỉ là một điều kỳ quặc tôi tình cờ phát hiện ra khi tôi đang phản ánh trên tất cả các loại để kiểm tra cái gì khác ngoài tò mò.Tại sao loại System .__ ComObject tuyên bố (đôi khi) được công khai khi nó không được?
Tại sao lớp học System.__ComObject
của hội đồng mscorlib.dll
(đôi khi?) Tuyên bố là công khai khi trên thực tế nó có vẻ không công khai? Nếu tôi chạy mã sau trong ứng dụng giao diện điều khiển C# đơn giản:
var t = Type.GetType("System.__ComObject");
Console.WriteLine(t.IsPublic); // "True" ?!
Console.WriteLine(t.IsVisible); // "False"
kết quả đầu ra có vẻ mâu thuẫn. Loại không lồng nhau (t.IsNested
là sai) phải cung cấp cùng một giá trị thật cho IsPublic
và IsVisible
. Khi tôi nhìn vào lắp ráp với IL DASM
tôi thấy:
.class private auto ansi beforefieldinit System.__ComObject
extends System.MarshalByRefObject
{
} // end of class System.__ComObject
đó, với tôi, trông rất giống một tổ chức phi công lớp , một cái gì đó sẽ tương ứng với mã # C dưới đây:
namespace System
{
// not public
internal class __ComObject : MarshalByRefObject
{
...
}
}
Khi tôi so sánh với loại khác có tên tương tự, System.__Canon
và các biến tố IL tương tự, cả hai IsPublic
và IsVisible
trả về false như mong đợi.
Có ai biết tại sao (và khi nào) Type.GetType("System.__ComObject").IsPublic
cho đúng không?
Hệ thống .__ ComObject và System .__ Canon là rất khác nhau - đầu tiên là đối tượng COM (IsCOMObject == true) - đó là lý do tại sao tôi nghĩ nó là Công cộng và thứ hai thì không. –
@Mihail Nếu tôi sử dụng 'var t = typeof (Uri) .Assembly.GetType (" System.Net.Mail.MSAdminBase ");' Tôi có một kiểu 't' khác cũng' IsCOMObject', nhưng 'IsNotPublic'. Vì vậy, đó có vẻ là một "counterexample" để giải thích rằng, trừ khi đây là một cái gì đó mà phụ thuộc vào lắp ráp ('System.Net.Mail.MSAdminBase' là trong một hội đồng, so với' System .__ ComObject'). –
Tất cả những gì tôi có thể tìm ra là, đây có thể là một khiếm khuyết! Tôi đã xem qua một số nội dung tương tự, có thể các bạn cũng đã gặp phải điều tương tự. Theo dõi [link] (http://microsoft.public.dotnet.framework.interop.narkive.com/06Y4MWuX/reflection-messing-up-the-type-hierarchy) – Nilesh