2011-08-31 27 views
5

Tôi cần tải tất cả các assembly từ các tệp DLL trong một thư mục.Chỉ tải DLL được lắp ráp được quản lý trong thư mục

mã cơ bản của tôi là:

var assemblies = from filename in Directory.GetFiles(HttpRuntime.BinDirectory, "*.dll") 
       select Assembly.LoadFrom(filename); 

Tuy nhiên, nếu có DLL không được quản lý trong thư mục đó rồi Assembly.LoadFrom thất bại. Có cách nào tốt để chỉ tải các DLL được quản lý? Bắt ngoại lệ tải là một lựa chọn, nhưng tôi muốn biết nếu có một cách tốt hơn.

Mã của tôi chạy trên ASP.NET, lúc khởi động ứng dụng. Vì vậy, tôi cũng sẽ chấp nhận một giải pháp cụ thể ASP.NET.

+0

Bạn có phải sử dụng thùng rác không? Bạn có thể tải từ thư mục khác chỉ chứa dll được quản lý không? – sestocker

+0

Có nó phải là thư mục asp.net 'bin' cho dự án này. –

Trả lời

4

từ đây:.. http://blogs.msdn.com/b/junfeng/archive/2004/02/06/68334.aspx

"Assembly.LoadFrom sẽ ném BadImageFormatException nếu tập tin được không phải là một hội đồng quản lý

ngoại lệ này có thể được ném vì lý do khác cũng Suzanne vui lòng chỉ ra một nhiều hơn Một khi bạn nắm bắt được BadImageFormatException, hãy nhìn vào trường HResult của nó. Nếu HResult là COR_E_ASSEMBLYEXPECTED, điều đó có nghĩa đây không phải là một assembly được quản lý. "

Điều đó có hữu ích không?

+0

Cảm ơn, điều đó ít nhất có nghĩa là tôi có thể rất chính xác về thời điểm bỏ qua ngoại lệ tải. Về cơ bản tôi muốn tránh trường hợp ngoại lệ tải xảy ra vì bất kỳ lý do nào khác. –

+0

Điều này có vẻ tốt sau đó - đã không thử nó bản thân mình, tâm trí! –

5

Chỉ cần lặp lại chúng một cách riêng biệt và đặt Assembly.LoadFrom trong khối try...catch.

+0

Làm điều đơn giản nhất có thể làm việc ... –

3

Một số googling dẫn tôi đến trang này: Detect if an assembly is a managed assembly. Âm thanh như thế này sẽ rất phù hợp.

Nó thực sự phụ thuộc vào bao nhiêu dll không được quản lý mà bạn mong đợi và mức độ nhạy cảm của bạn về thời gian khởi động của bạn (tôi giả sử bạn đang thực hiện việc này khi khởi động). Nếu bạn có thể thư giãn trên cả hai tài khoản, thì try...catch chắc chắn là điều đơn giản nhất để thực hiện, nếu không, đọc thông tin tiêu đề lắp ráp phải là đơn đặt hàng của cường độ nhanh hơn.

+0

Rất tuyệt! Nhưng tôi sẽ đi với đánh bắt BadImageFormatException và kiểm tra HResult vì tôi không mong đợi các DLL không được quản lý ở đó hầu hết thời gian :) –

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