2011-12-27 19 views
6

Tôi đã thiết lập một ví dụ nhỏ khi tôi tải một assembly vào một AppDomain mới mà không có bất kỳ quyền nào. Điều này hoạt động tốt, lắp ráp không thể truy cập vào hệ thống tập tin và không thể nghe các ổ cắm.Ngăn chặn tạo chuỗi trong AppDomain

Nhưng có một điều tôi muốn ngăn chặn: Tạo chủ đề. Tại sao? Nguyên nhân lý thuyết này lắp ráp có thể tạo ra một sợi mà tạo ra nhiều chủ đề hơn và làm ngập bộ nhớ của tôi.

Tôi đã nghĩ đến (theo ý kiến ​​của tôi) cách tốt nhất: Hạn chế bộ nhớ của một AppDomain. Điều này có thể không? Và nếu không, tôi có thể làm gì để tránh tạo luồng?

Đã sử dụng mã này để tạo ra các chủ đề

Thread t = new Thread(this.DoWork); 
t.Start(); 

Và mã này cho AppDomain

PermissionSet set = new PermissionSet(PermissionState.None); 
set.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution)); 
set.AddPermission(new FileIOPermission(FileIOPermissionAccess.Read | 
             FileIOPermissionAccess.PathDiscovery, 
             this.path)); 

AppDomainSetup info = new AppDomainSetup { ApplicationBase = this.path }; 

this.domain = AppDomain.CreateDomain("Sandbox", null, info, set, null); 

(Ok, tôi đã cung cấp quyền truy cập vào hệ thống tập tin trong thư mục mà tôi muốn nạp lắp ráp, điều này chỉ vì StrongName fullTrustAssembly = typeof(SecureInstance).Assembly.Evidence.GetHostEvidence<StrongName>(); cũng không hoạt động đối với tôi.

Hy vọng có thể trợ giúp. (:

+1

Không có cách nào bạn có thể làm điều này AFAIK :) Điều duy nhất bạn có thể làm là thiết lập giới hạn của các chủ đề trong một hồ bơi thread – Elastep

+1

AFAIK mỗi AppDomain cần tạo ít nhất một luồng - nếu không nó không thể chạy ... vì vậy việc vô hiệu hóa tạo luồng sẽ có nghĩa là nó không thể chạy ở tất cả IMHO. Bạn đang cố gắng đạt được điều gì? – Yahia

+0

@Elastep Cảm ơn câu trả lời của bạn, nhưng điều này có an toàn không? Tôi nghĩ rằng có thể mở rộng giới hạn chuỗi tại bất kỳ phần mềm nào. Toàn bộ điều này mang lại cho Java một lợi thế lớn. Trong Java, SecurityManager được hỏi trước khi tạo luồng. –

Trả lời

2

Có vẻ như không có câu trả lời dễ dàng cho việc này. Những gì bạn có thể làm là sử dụng .NET Profiling API để thử và theo dõi việc sử dụng bộ nhớ trong AppDomain của bạn. Bạn có thể tìm hiểu thêm về vấn đề này tại đây, nhưng bạn cần phải thực hiện một số thao tác đào tạo: http://msdn.microsoft.com/en-us/library/bb384493.aspx

Dù sao, tốt hơn hết là chạy bất kỳ thứ gì bạn muốn chạy trong một quy trình riêng biệt có mức độ ưu tiên thấp hơn, vì vậy nếu nó đi tất cả hoang dã với phân bổ bộ nhớ, nó không ảnh hưởng đến quá trình của bạn, hệ điều hành giết chết nó và nó không ảnh hưởng đến quá trình chính của bạn?

+0

Tuyệt vời, cảm ơn, tôi sẽ thử! –

+0

Vấn đề với cách ly mức xử lý là chi phí của nhiều quy trình. Vì các chủ đề không thể bị hủy bỏ một cách an toàn bởi một AppDomain lưu trữ, tôi phải chắc chắn rằng chúng không thể được tạo ra. Nếu điều này không thể được thực hiện, sau đó tôi có lẽ phải theo dõi cho "vi phạm" và giết chết toàn bộ quá trình. Dễ dàng hơn nhưng tồi tệ hơn cho hiệu suất là bi quan giết chết quá trình mỗi lần. Nhưng điều đó làm tổn thương hiệu suất của tất cả mọi người đang hành xử. –

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