2011-12-27 15 views
6

Herhangi bir izin olmadan yeni bir Uygulama etki alanına bir derleme yüklediğim küçük bir örnek oluşturdum. Bu iyi çalışıyor, derleme dosya sistemine erişemiyor ve yuvaları dinleyemiyor.AppDomain uygulamasında iş parçacığı oluşumunu engelle

Önlemek istediğim başka bir şey var: Konu oluşturma. Niye ya? Teorik olarak, bu montaj bile daha fazla iş parçacığı oluşturan ve belleğimi akıtan bir iş parçacığı oluşturabilir.

(Bence) en iyi şekilde düşündüm: Bir AppDomain belleğinin sınırlanması. Mümkün mü? Ve değilse, iş parçacığı oluşumunu önlemek için ne yapabilirim?

(Tamam, ben yüklemek istediğiniz klasöre dosya sistemine erişim verdi iplik

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

Ve 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); 

için bu kodu oluşturmak için bu kodu kullanılmış montaj, bu sadece StrongName fullTrustAssembly = typeof(SecureInstance).Assembly.Evidence.GetHostEvidence<StrongName>(); çünkü benim için de işe yaramaz olduğunu

Umut s/o yardımcı olabilir. (:.

+1

Bunu yapmanın hiçbir yolu yok AFAIK :) Yapabileceğin tek şey, her bir AppDomain'in en az bir iş parçacığı oluşturmak için – Elastep

+1

AFAIK bir iş parçacığı havuzundaki iş parçacığı sınırını ayarlamaktır. Dolayısıyla, iş parçacığı oluşturmayı devre dışı bırakmak, tüm IMHO'da çalışamayacağı anlamına gelir. Neyi başarmaya çalışıyorsun? – Yahia

+0

@Elastep Cevabınız için teşekkürler, ancak bu güvenli mi? İplik sınırını herhangi bir yazılım parçasında genişletmenin mümkün olduğunu düşünüyorum. Her şey Java'ya büyük bir artı verir. Java'da, iş parçacığı oluşturmadan önce SecurityManager sorulur. –

cevap

2

Bunun için kolay bir cevap yok gibi görünüyor. Yapabilecekleriniz, AppDomain öğenizdeki bellek kullanımını denemek ve izlemek için .NET Profilleme API'sını kullanmaktır. Burada bu konuda daha fazla bilgi bulabilirsiniz, ancak bazı kazı yapmak gerekir: Neyse http://msdn.microsoft.com/en-us/library/bb384493.aspx

, daha iyi daha düşük bir önceliğe sahip ayrı bir işlemde çalıştırmak istediğini çalıştırmak, bu yüzden eğer değil bellek tahsisleri ile tüm vahşi gider, bu sizin işleminizi etkilemez, OS onu öldürür ve ana sürecinizi etkilemez?

+0

Harika, teşekkürler, deneyeceğim! –

+0

İşlem düzeyinde yalıtım ile ilgili sorun, birden fazla işlemin ek yüküdür. Iş parçacığı bir uygulama etki alanı tarafından güvenli bir şekilde iptal edilemediğinden, oluşturulamayacaklarından emin olmalıyım. Eğer bu yapılamazsa, belki de “ihlalleri” izlemek zorundayım ve tüm süreci öldürmeliyim. Performans için daha kolay ama daha kötüsü, her seferinde işlemi kötümser bir şekilde öldürüyor. Ama bu, davranan herkesin performansını acıtıyor. –

İlgili konular