2011-12-27 47 views
6

我已經設置了一個小例子,其中我將一個程序集加載到沒有任何權限的新AppDomain中。這工作正常,程序集無法訪問文件系統並且無法偵聽套接字。阻止在AppDomain中創建線程

但還有一件事我想要防止:創建線程。爲什麼?原因理論上這個程序集可以創建一個線程,創建更多的線程和洪水我的記憶。

我想到了(在我看來)最好的方法:限制AppDomain的內存。這可能嗎?如果不是,我能做些什麼來避免創建線程?

使用此代碼來創建線程

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

而這種代碼在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); 

(好吧,我給訪問該文件夾中的文件系統,我想加載組裝,這只是因爲StrongName fullTrustAssembly = typeof(SecureInstance).Assembly.Evidence.GetHostEvidence<StrongName>();不適合我。

希望可以幫忙。(:

+1

沒辦法,你可以這樣做AFAIK :)你可以做的唯一的事情就是設置線程池中線程的限制 – Elastep 2011-12-27 12:03:49

+1

AFAIK每個AppDomain需要創建至少一個線程 - 否則它不能運行...所以禁用線程創建意味着它不能運行在所有恕我直言。你想達到什麼目的? – Yahia 2011-12-27 12:07:24

+0

@Elastep感謝您的回答,但這是安全的嗎?我認爲可以在任何軟件上擴展線程限制。整個事情給Java帶來了很大的好處。在Java中,SecurityManager在線程創建之前被詢問。 – 2011-12-27 12:09:24

回答

2

似乎沒有簡單的答案。你可以做的是使用.NET Profiling API來嘗試和監控AppDomain中的內存使用情況。你可以在這裏找到更多關於它的信息,但是你需要做一些挖掘工作:http://msdn.microsoft.com/en-us/library/bb384493.aspx

無論如何,運行你想在低優先級的獨立進程中運行的任何東西都不是更好,所以如果它內存分配全是瘋狂的,它不會影響你的進程,操作系統會殺死它,它不會影響你的主進程?

+0

太好了,謝謝,我會試一試! – 2011-12-27 12:19:58

+0

流程級別隔離的問題是多個流程的開銷。由於主機AppDomain不能安全地中止線程,因此我必須確保它們不能被創建。如果做不到這一點,那麼我必須監測「違規行爲」並殺死整個過程。對於性能更容易但更糟糕的是每次都悲觀地殺死該進程。但是這會傷害每個表現出色的人的表現。 – 2014-01-08 16:46:52