前面好幾篇文章,老周都跟大伙伴們聊了跟應(yīng)用程序域有關(guān)的話題,干脆咱們一聊到底吧,做學(xué)問就應(yīng)該這樣,有恒心。
App Domain的創(chuàng)建新應(yīng)用程序域的方法中,有一個特殊的重載:
public static AppDomain CreateDomain(string friendlyName, Evidence securityInfo, AppDomainSetup info, PermissionSet grantSet, params StrongName[] fullTrustAssemblies);
這個重載比較特殊,它與咱們今天扯的話題接近,因?yàn)樗膮?shù)列表中有一個是 PermissionSet 類型的,它表示一個權(quán)限的集合,當(dāng)創(chuàng)建應(yīng)用程序域時,通過這個權(quán)限集合,限制在新應(yīng)用程序域中執(zhí)行的代碼的權(quán)限。在各個CreateDomain方法的重載中,只有這個有設(shè)置權(quán)限集的參數(shù)。
運(yùn)用這個重載方法,可以將你覺得要限制權(quán)限的代碼放到這個新的應(yīng)用程序域中執(zhí)行,即創(chuàng)建一個“沙箱”。比如,你拿到別人寫的一個類庫A,不過你不知道這個類庫A在執(zhí)行過程中會干什么,于是,你希望在使用這個來路不明的類庫時,可以限制一下它,例如不讓它讀寫文件,或者說只允許它訪問某些目錄和文件。
為了偷工減料,寫出豆腐渣程序,老周舉的這個例子,是把做測試用的代碼寫到主程序集中。它有一個類,類中有一個方法,調(diào)用之后,會在“文檔”庫中創(chuàng)建一個文件,然后寫入一些見不得人的內(nèi)容。
public class Demo : MarshalByRefObject { public void