2011-12-19 39 views
9

Tôi đã tìm kiếm ở khắp mọi nơi để có giải pháp khả thi cho điều này nhưng dường như không thể tìm thấy câu trả lời. Vấn đề của tôi là tôi có một vài lớp cần phải ẩn hoàn toàn khỏi Assembly.getTypes, vì tôi đang viết một plugin cho một ứng dụng, và nó nhận các kiểu mà tôi cần phải ẩn đi (điều này xảy ra ngay cả khi chúng được khai báo là các lớp học riêng hoặc nội bộ).Ẩn các loại được liệt kê trong Assembly.GetTypes in .net

bất kỳ ai biết cách thay đổi assembly.GetTyes trả về hoặc thuộc tính aficionado sẽ giữ cho các loại đó không được liệt kê?

+0

Bạn không thể ẩn nội dung khỏi sự phản chiếu, nó không phải là một cơ chế bảo mật. –

+0

@BenRobinson: Bạn không thể ẩn nội dung khỏi sự phản chiếu, vì đó là cơ chế bảo mật. Siêu dữ liệu loại được sử dụng trong quá trình truy cập ngăn xếp và kiểm tra quyền. –

+0

Xin lỗi tôi đã nhận được nó trở lại phía trước, những gì tôi có nghĩa là mức độ bảo vệ như bảo vệ và nội bộ không phải là cơ chế bảo mật. –

Trả lời

6

Đây là một hack khá mỏng manh, nhưng có thể hoạt động.

Tạo 2 hội đồng - một cho trình cắm và thứ hai cho các loại khác. Thư mục thứ hai sẽ được đặt trong một thư mục khác được biết đến và được nạp tự động vào thư mục đầu tiên khi cần. (Ví dụ: qua số Assembly.LoadFrom.)

Lắp ráp đầu tiên sau đó sẽ được đặt trong thư mục trình cắm và chỉ xuất bản các loại của nó. Điều này rất mong manh bởi vì bạn có thể sẽ phải mã hóa một đường dẫn đến assembly thứ hai và bạn có nguy cơ bị xóa hoặc di chuyển.

CHỈNH SỬA
Nhận xét của @SLaks lấy đi sự mong manh của giải pháp này. Nếu bạn nhúng cụm thứ hai làm tài nguyên và tải nó vào thời gian chạy, ứng dụng gọi Assembly.GetTypes sẽ không thấy các loại bạn muốn ẩn.

+3

Bạn có thể tải cụm từ thứ hai từ một tài nguyên được nhúng. – SLaks

+0

Ahh ... không nghĩ về điều đó. Ý tưởng tốt! –

+0

Ý tưởng tuyệt vời! May thay, thư mục này không phải là một vấn đề bởi vì ứng dụng trưng ra các thư mục mà tôi có thể truy cập, nhưng ý tưởng tài nguyên là thiên tài. –

2

Điều này là không thể.
Rất tiếc.

Mã gọi Assembly.GetTypes() thường chỉ lọc cho các loại public.

0

Chào mừng bạn đến với mã được quản lý. Thông tin loại hoàn chỉnh là cần thiết cho trình xác minh loại .NET. Chỉ có mã nguồn gốc có thể được ẩn từ siêu dữ liệu .NET, và sau đó bạn từ bỏ tính di động và các quyền được hỗ trợ bởi MSIL thuần túy.

Các vấn đề liên quan