c# 没有非托管权限的无法验证的代码

Posted

技术标签:

【中文标题】c# 没有非托管权限的无法验证的代码【英文标题】:c# unverifiable code without unmanaged permission 【发布时间】:2012-06-07 15:09:41 【问题描述】:

我有一个 .net 程序集,其方法无法验证。

我正在尝试将此程序集加载到沙盒应用程序域中。

如果我使用跳过验证加载,而不是使用非托管加载,我会收到验证异常。像这样:

new SecurityPermission(SecurityPermissionFlag.Execution | 
                       SecurityPermissionFlag.SkipVerification);

如果我使用非托管权限加载它可以工作,但应用程序域将不够“沙盒”。

new SecurityPermission(SecurityPermissionFlag.Execution | 
                       SecurityPermissionFlag.SkipVerification |
                       SecurityPermissionFlag.UnmanagedCode);

另外 - 我正在运行 .Net 4,为了使上述内容正常工作,我必须切换到 transperancy 模型级别 1,如下所示:

[assembly:SecurityRules(SecurityRuleSet.Level1)]

所以,我的问题是:

    有没有办法在没有 UnamangeredCode 权限的情况下运行未经验证的代码。 有没有办法使上述内容与 Level2 安全规则集一起使用。

谢谢!

【问题讨论】:

应用程序要么是沙盒,要么不是。那么“沙盒不够”到底是什么意思呢?听起来您需要获得可验证的程序集,而不是尝试创建解决方法。 在这个沙箱中,我需要保护用户免受他自己的伤害,而不是针对一些潜在的威胁。这就是为什么我不担心无法验证的代码。但我担心非托管代码。无论如何,由于我使用了一些 .net 框架,我无法对其进行验证。 【参考方案1】:

有没有办法在没有 UnamangedCode 的情况下运行未经验证的代码 权限。

即使有,那时您也会放弃任何安全措施。无法验证的代码与非托管代码具有相同的功能。例如,它允许您打破类型系统。

拥有 SkipVerification 而不是 UnmanagedCode(或相反)是没有意义的。两者是等价的,我认为这是两者都存在的框架中的一个错误。

【讨论】:

以上是关于c# 没有非托管权限的无法验证的代码的主要内容,如果未能解决你的问题,请参考以下文章

从 C# 获取非托管 C++ 函数

从 C# 调用 C++ dll。 “无法封送'返回值':托管/非托管类型组合无效。”

C#:捕获混合托管/非托管进程的所有错误/异常

C# 托管非托管代码

调试从非托管 C++ 调用的托管 .NET 代码

托管 C# 代码未发生非托管调用