gpt4 book ai didi

c# - 由于过时的 CAS 政策,寻求替代 AppDomain.CreateDomain(string, evidence)

转载 作者:可可西里 更新时间:2023-11-01 08:40:00 26 4
gpt4 key购买 nike

我正在学习 Microsoft .Net Framework--Application Development Foundation Training Kit 书第 8 章第 2 课:配置应用程序域

ShowWinIni 是我要执行的程序的程序集名称

object[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);

// Create an AppDomain.
AppDomain d = AppDomain.CreateDomain("New Domain", e);

// Run the assembly
d.ExecuteAssemblyByName("ShowWinIni");

当我执行时:

AppDomain d = AppDomain.CreateDomain("New Domain", e);

我收到以下消息:“此方法隐式使用已被 .NET Framework 废弃的 CAS 策略。为了出于兼容性原因启用 CAS 策略,请使用 NetFx40_LegacySecurityPolicy 配置开关。请参阅 http://go.microsoft.com/fwlink/?LinkID=155570 了解更多信息。”

当我创建一个没有 Evidence 对象的 AppDomain 时,我可以很好地执行程序集。

当然是访问了http://go.microsoft.com/fwlink/?LinkID=155570但我仍然对如何创建具有指定权限的应用程序域感到困惑。

我发现的下一个最有帮助的站点是 http://msdn.microsoft.com/en-us/library/bb763046.aspx但是我的 StrongName 对象计算为 NULL。

StrongName fullTrustAssembly =
typeof(Program).Assembly.Evidence.GetHostEvidence<StrongName>();

Program 是实现所有这些代码的类的名称。

提前感谢您的建议和提示!

最佳答案

我找到了一种无需启用 NetFX40_LegacySecurityPolicy 即可使原始代码示例正常工作的方法。

EvidenceBase[] hostEvidence = { new Zone(SecurityZone.MyComputer) };
Evidence e = new Evidence(hostEvidence, null);

AppDomain d = AppDomain.CreateDomain("New Domain", e);

d.ExecuteAssemblyByName("ShowWinIni");

如果您将 SecurityZone 更改为 Internet,这将不起作用,它将尝试使用过时的 CAS 安全策略,从而导致 NotSupportedException。我想要的是一个 SecurityException...意味着我要执行的程序集没有它需要的权限。

要在具有受限权限的 AppDomain 中执行程序集,您需要使用沙盒。我发现的最好的沙盒示例在这里: http://www.simple-talk.com/dotnet/.net-framework/whats-new-in-code-access-security-in-.net-framework-4.0---part-i/

我认为该页面也很好地解释了 4.0 中对 CAS 所做的更改!

包括 MSDN 在内的许多资源让我确信我需要在调用时提供一个 StrongName 数组:

AppDomain.CreateDomain( string friendlyName,
Evidence securityInfo,
AppDomainSetup info,
PermissionSet grantSet,
params StrongName[] fullTrustAssemblies);

如我原来的帖子所述,我曾经(现在仍然)在获取 StrongName 对象而不是 null 时遇到问题。结果我什至不需要它!

这是我完成的沙盒示例:

Evidence ev = new Evidence();
ev.AddHostEvidence(new Zone(SecurityZone.Internet));
PermissionSet internetPS = SecurityManager.GetStandardSandbox(ev);

AppDomainSetup adSetup = new AppDomainSetup();
adSetup.ApplicationBase = Path.GetFullPath(pathToUntrusted);

AppDomain newDomain = AppDomain.CreateDomain("Sandbox Domain", null, adSetup, internetPS);

newDomain.ExecuteAssemblyByName(untrustedAssembly);

pathToUntrusted = 程序集文件路径的字符串表示

untrustedAssembly = 程序集名称的字符串表示

关于c# - 由于过时的 CAS 政策,寻求替代 AppDomain.CreateDomain(string, evidence),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4824732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com