C #: Liệt kê tất cả các lớp trong Assembly


103

Tôi muốn xuất (theo chương trình - C #) một danh sách tất cả các lớp trong hợp ngữ của tôi.

Bất kỳ gợi ý hoặc mã mẫu làm thế nào để làm điều này? Phản ánh?


Nếu ý định của bạn là kiểm tra một assembly không được tham chiếu bởi dự án của bạn, hãy xem câu trả lời đã cập nhật của tôi.
Thorarin

Câu trả lời:


152

Sử dụng Assembly.GetTypes. Ví dụ:

Assembly mscorlib = typeof(string).Assembly;
foreach (Type type in mscorlib.GetTypes())
{
    Console.WriteLine(type.FullName);
}

1
Bất kỳ đề xuất cho các lắp ráp lớn? Khi tôi chạy mã này cho một lắp ráp 13,8 MB phiên bản VS của tôi bị treo cho cảm giác như vô thời hạn. Tôi đã thử một bản lắp ráp nhỏ 9 KB và nó hoạt động tốt. Tôi biết bạn đang nghĩ gì - tại sao bạn có một tập hợp 13,8 MB - nó là một phần của lớp dữ liệu của tôi được tạo bằng mẫu NetTeirs. Chúng tôi có nhiều bảng.
dyslexicanaboko.

1
@dyslexicanaboko: Chà nếu bạn có nhiều loại thì sẽ mất nhiều thời gian để liệt kê hết. Có bao nhiêu loại đang trong lắp ráp của bạn mặc dù? Và bạn đang làm gì với chúng? (Bạn có chắc chắn vấn đề là ở giải nén các loại, hoặc chỉ là những gì bạn đang làm sau đó?)
Jon Skeet

Tôi không thể vượt qua cuộc gọi asm.GetTypes (), nó chỉ bị treo - ý tôi là rõ ràng thực tế là có rất nhiều Loại - Tôi không thể làm gì vì nó đang cố gắng lấy hết chúng. . CPU của tôi tăng đến 30% trên một trong 4 lõi của tôi. Ý tôi là thực sự tôi đang tự hỏi liệu có cách nào để nói, "Này - chỉ xem trong không gian tên NÀY" - Tôi có ấn tượng rằng không thể thực hiện được vì phương thức GetTypes () chỉ có một hàm tạo trống. Tôi đang cố gắng tạo một trình duyệt đối tượng.
dyslexicanaboko.

1
Điểm tốt, tôi chưa thử điều đó. Công việc của tôi bây giờ là chỉ nhắm mục tiêu các lớp trực tiếp bằng cách sử dụng asm.GetType (FullQualifiedClassName) - điều đó hoạt động, nhưng hiển thị danh sách các lớp cho người dùng là không thể, đó là điều tôi muốn. Đây không phải là khách hàng phải đối mặt với btw, tôi đang sử dụng nó trong nội bộ cho bản thân và các nhà phát triển khác.
dyslexicanaboko.

1
@DebugErr: Có - thật dễ dàng, đủ để làm cho nó chỉ lớp học nếu bạn muốn, nhưng tôi đoán là OP lẽ thực sự muốn tất cả các loại.
Jon Skeet

102

Tôi chỉ muốn thêm vào ví dụ của Jon. Để tham khảo lắp ráp của riêng bạn, bạn có thể sử dụng:

Assembly myAssembly = Assembly.GetExecutingAssembly();

System.Reflection không gian tên.

Nếu bạn muốn kiểm tra một assembly mà bạn không có tham chiếu đến, bạn có thể sử dụng một trong hai cách sau:

Assembly assembly = Assembly.ReflectionOnlyLoad(fullAssemblyName);
Assembly assembly = Assembly.ReflectionOnlyLoadFrom(fileName);

Nếu bạn có ý định khởi tạo loại của mình khi bạn đã tìm thấy nó:

Assembly assembly = Assembly.Load(fullAssemblyName);
Assembly assembly = Assembly.LoadFrom(fileName);

Xem tài liệu lớp Assembly để biết thêm thông tin.

Khi bạn có tham chiếu đến Assemblyđối tượng, bạn có thể sử dụng assembly.GetTypes()như Jon đã trình bày.


Làm cách nào tôi có thể tham chiếu đến một lắp ráp hoàn toàn khác trong giải pháp của tôi?
Alex

13
Cách dễ nhất là sử dụng typeofmột kiểu mà bạn biết là trong assembly đó, và sau đó là thuộc Assemblytính, như trong ví dụ của tôi.
Jon Skeet

2
Nếu bạn muốn tham chiếu đến một assembly, hãy nói abc.dll, đó là giải pháp của bạn và nếu bạn đồng ý mã hóa cứng tên dll, một cách tiếp cận khác để tham chiếu đến assembly là: `Assembly assembly = Assembly.Load (" abc ");`
Kash

Nó chỉ tải lắp ráp hiện tại. Tôi có một ứng dụng hoặc exe sử dụng 4 dlls hoặc dự án. Làm thế nào tôi có thể lấy tên của các lớp của các hình nền đó?
Er Mayank

@JonSkeet Làm thế nào điều này có thể đạt được trong môi trường c # "hiện đại"? Chẳng hạn như khi thực hiện phát triển UWP. UWP không có phương thức GetExecutingAssembly ().
Daniel Armstrong
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.