2014-05-07 14 views
7

Vì các tệp DLL được tải trong bộ nhớ, có bất kỳ lý do gì khiến các dll tham chiếu phải bị khóa bởi tiến trình đang chạy không? Có cách nào xung quanh khóa khác hơn là sao chép các dlls vào một thư mục tạm thời và tải từ đó?Tại sao tệp khuôn khổ .NET dll?

+5

Có thể vì bạn không muốn mã bạn đang chạy bị hoán đổi từ bên dưới bạn (đặc biệt là vì nó chưa được JIT đã được biên soạn). – BradleyDotNET

+0

Các ứng dụng Windows và Windows có xu hướng khóa các tập tin mà chúng sử dụng hoặc phụ thuộc. – zneak

+0

Nếu bạn đăng sự cố, bạn có thể gặp phải sự cố. – Ehsan

Trả lời

17

Đó là tác dụng phụ của CLR tạo chế độ xem ánh xạ bộ nhớ của một assembly để ánh xạ nó vào bộ nhớ. Các tệp ánh xạ bộ nhớ là một tính năng cấp thấp trong Windows, cũng được hiển thị trong .NET 4.0 với lớp MemoryMappedFile. Nếu không, một tính năng phổ biến trong hệ điều hành bộ nhớ ảo được phân trang theo yêu cầu như Windows.

MMF có nhiều thuộc tính mong muốn. Các hành động "tải" một hội đồng trở nên rất đơn giản và rất nhanh. Không có gì là thực sự đọc từ tập tin, nó sẽ xảy ra trong một thời trang lười biếng. Mỗi byte trong tệp có địa chỉ bộ nhớ tương ứng. Khi CLR cố gắng đọc một byte trong siêu dữ liệu lắp ráp hoặc IL lần đầu tiên, bộ vi xử lý sẽ truy cập một lỗi trang vì trang này không có trong RAM. Hệ điều hành xử lý nó bằng cách tự động đọc nội dung tập tin từ đĩa. CLR tiếp tục như thể không có gì xảy ra, nó hoàn toàn không biết về những gì đã xảy ra.

Kiểu truy cập lười biếng này thật tuyệt, bạn không phải trả tiền cho những gì bạn không sử dụng. Vì vậy, nếu bạn cần một phương pháp duy nhất từ ​​một loại duy nhất trong, nói, một hội đồng lớn như Microsoft.VisualBasic.dll sau đó bạn chỉ trả tiền cho phương pháp đó. Chương trình của bạn không bao giờ thực sự đọc siêu dữ liệu của các loại khác hoặc IL của các phương pháp khác.

Còn hơn thế nữa. Bạn không phải trả tiền cho việc cam kết bộ nhớ. Nếu một quá trình khác trên máy cần RAM thì các trang có chứa dữ liệu lắp ráp chỉ có thể bị loại bỏ. Vì chúng chỉ có thể được tải lại từ tệp. Họ không cần phải được hỗ trợ bởi tệp hoán trang, bộ nhớ ảo rẻ nhất mà bạn có thể mua.

Còn hơn thế nữa. Thực tế là dữ liệu lắp ráp luôn luôn cần phải được tải lại từ các tập tin tại bất kỳ thời điểm nào cũng có nghĩa là nó không bao giờ có thể được chính xác để cho phép bất cứ ai để sửa đổi các tập tin. Vì điều đó sẽ làm cho dữ liệu trong RAM không khớp với dữ liệu trong tệp. Và để nó thay đổi ngẫu nhiên từ quan điểm của CLR vì nó không thể quan sát lỗi trang. Vì vậy, một MMF đặt một khóa cứng vào tập tin, không ai có thể gây rối với nó. Đây là tính năng chống phần mềm độc hại miễn phí.

Còn hơn thế nữa. Việc bảo đảm khóa cũng có nghĩa là CLR không bao giờ phải đối phó với mã jitted không còn phù hợp với IL trong assembly. Một cái gì đó sẽ cực kỳ khó thực hiện vì những thay đổi ngẫu nhiên trong assembly không thể đồng bộ hóa đúng với việc thực thi mã. Và nó sẽ tốn kém khủng khiếp, các cuộc gọi phương thức không thể là lệnh CALL đơn giản nữa. Và nó không giới hạn mã, phương thức đích của đối tượng ủy nhiệm sẽ phải được giải quyết động. Những kẻ giết người rất lớn. Nếu không một vấn đề được giải quyết, đây là lý do tại sao CLR hỗ trợ khái niệm của một AppDomain. Tải xuống miền ứng dụng sẽ hủy mọi mã mọi thứ, mã và dữ liệu. Kỹ thuật cơ bản đằng sau các cụm sao chép bóng, như được sử dụng trong các ứng dụng sẵn sàng cao như ASP.NET

+0

Tệp ánh xạ bộ nhớ Aaaah. Điều đó có ý nghĩa. Cảm ơn tất cả các thông tin! –