我正在尝试创建一个沙盒应用程序域。为了实现这一点,我使用AppDomain.CreateDomain
,给出要沙盒化的 DLL 的路径。
但是,我注意到如果该 DLL 在 GAC 中,则该 DLL 是完全受信任的,因此如果其中有一个PermissionSet.Assert
,它可以接收不受限制的访问。
所以,我想知道是否有办法
- 强制DLL从路径加载,而不是从GAC加载,因此它将是部分信任的。
- 或 - 将 GAC 中的某个 DLL 标记为部分信任。
谢谢!
如果两个程序集都已完全签名,则 CLR 将使用 GAC 中的一个。如果您将目标路径中的那个保留为无符号,CLR 将使用那个代替。
如果这不是一个选项,那么您需要使用 CreateDomain 覆盖之一,您可以在其中定义程序集所需的权限集。可以在此处找到有关覆盖的更多信息:http: //msdn.microsoft.com/en-us/library/ms130766.aspx。
使用示例取自http://davedewinter.com/2009/05/22/how-to-host-a-partial-trust-sandbox/ ...
static void RunInPartialTrust()
{
AppDomainSetup setup = new AppDomainSetup
{
ApplicationBase = Environment.CurrentDirectory
};
PermissionSet permissions = new PermissionSet(null);
permissions.AddPermission(new SecurityPermission(SecurityPermissionFlag.Execution));
permissions.AddPermission(new ReflectionPermission(ReflectionPermissionFlag.RestrictedMemberAccess));
AppDomain appDomain = AppDomain.CreateDomain(
"Partial Trust AppDomain",
null,
setup,
permissions
);
Program p = (Program)appDomain.CreateInstanceAndUnwrap(
typeof(Program).Assembly.FullName,
typeof(Program).FullName
);
p.PartialTrustMain();
}