AppDomains là một cấu trúc mã được quản lý thuần túy. Không có gì giống như vậy tồn tại trong mã nguồn gốc, cũng như Windows không có bất kỳ ý tưởng nào về nó. Vì vậy, phạm vi cho một DLL bản địa nạp là quá trình. Về mặt kỹ thuật, trình khắc phục sự cố có thể tham khảo đếm DLL và theo dõi chính xác mà AppDomain đã kích hoạt tải của DLL. Tuy nhiên nó không thể cho biết liệu bất kỳ mã nguồn gốc nào đang chạy có sử dụng DLL đó hay không. Mã gốc có thể được bắt đầu bằng một cuộc gọi được thực hiện từ mã trong một tên miền khác AppDomain, có thể gián tiếp thông qua một đại biểu được sắp xếp hợp pháp.
Cảnh báo thảm họa rõ ràng nếu người quản lý AppDomain dỡ tải một DLL được sử dụng theo cách đó, đó là một điều khó chịu và không thể chẩn đoán AccessViolation. Đặc biệt khó chịu vì nó có thể kích hoạt một thời gian dài sau khi AppDomain đã được dỡ xuống.
Vì vậy, trình soạn thảo không thực hiện loại đếm đó, DLL vẫn được tải. Chỉ có bạn mới có thể đảm bảo rằng điều này không thể xảy ra, bạn có một số biện pháp kiểm soát chính xác mã nào đang chạy trong DLL và cách nó được bắt đầu. Bạn có thể buộc DLL dỡ bỏ nhưng nó yêu cầu hack. Pinvoke LoadLibrary() mình để có được một xử lý để DLL. Và pinvoke FreeLibrary() hai lần để tải nó xuống. Cả Windows lẫn CLR đều không thể thấy rằng bạn đang lừa dối. Bạn phải đảm bảo rằng không thể sử dụng DLL sau này.
Nguồn
2012-04-04 16:27:54
+1 tốt đẹp hack :-) – Yahia
Hey, chỉ muốn nói cảm ơn cho câu trả lời rất rõ ràng! – user472875