2009-02-04 77 views
2

我是currently developing an application,其中用戶將動態選擇dll,應用程序將執行該dll中的某些方法。 (如果您按照第一個鏈接,您將看到我正在開發一種使用.Net FrameworkRobocode遊戲應用程序)。從「沙盒環境」中的.Net應用程序加載程序集

例如,當戰鬥開始時,將從dll執行run方法。

由於在run方法中指定的任何內容都將被執行,所以必須應用相當多的安全約束。

就像例如,如果編寫dll的用戶,而不是僅使用從界面適用的方法(機器人用於走路和開火等的方法......),將調用將檢索文件的方法甚至可能從硬盤上刪除文件...當另一個用戶將該DLL加載到他的電腦中時,這些方法將在他的電腦上被調用,並且他的文件將被這個惡意代碼修改。

因此,我需要以某種方式使這個應用程序運行從某種沙箱環境這樣無論是調用的方法,也不會影響該DLL打開計算機的硬盤上。

關於如何開始做這件事的任何想法?

這裏是我如何加載這些DLL並調用它們的方法的例子:

for (int i = 0; i < robotList.Count; i++) 
{ 
    IRunnable o = robotList[i]; 
    new Thread(delegate() 
    { 
     o.run();  
    }).Start(); 
} 

回答

7

通常情況下,你可能只用

AppDomain newDomain = AppDomain.CreateDomain(name); 
Assembly asm = newDomain.Load(System.IO.File.ReadAllBytes(name)); 

但一個有趣的一點生活,則AppDomain.Load方法的程序集加載到新的應用程序域,以及當前域。

更優雅的解決方案是使用3.5中的System.AddIn命名空間。 - http://msdn.microsoft.com/en-us/magazine/cc163476.aspx

然後,你其實可以指定信任級別爲您的插件,使用AddinSecurityLevel像

//Activate the selected AddInToken in a new 
//application domain with the Internet trust level. 
Calculator CalcAddIn = selectedToken.Activate<Calculator>(AddInSecurityLevel.Internet); 

http://msdn.microsoft.com/en-us/library/bb355219.aspx瞭解詳情。