封闭源程序集的“无法验证的代码未通过策略检查”

Posted

技术标签:

【中文标题】封闭源程序集的“无法验证的代码未通过策略检查”【英文标题】:"Unverifiable code failed policy check" for a closed source assembly 【发布时间】:2010-04-10 03:27:58 【问题描述】:

我试图在 MSI 安装例程期间从 C# 程序的资源流中动态加载一些(购买的)程序集,但我收到“无法验证的代码未能通过策略检查”。

我在网上阅读了一些关于使用 /clr:safe 编译嵌入式程序集的提示,但我没有那个选项。有没有办法绕过这项政策检查?

谢谢。

【问题讨论】:

不是您实际问题的答案 - 但为什么将程序集隐藏在资源流中而不是直接将它们包含在 msi 中?即使您只在安装时需要它们,让 msi 引擎部署它们也不会太难。 因为我不希望它们粘在可见的地方,在某些情况下它可以在安装后运行。 我知道,这是个老问题.. 但仍然想看看,如果这有帮助吗? 【参考方案1】:

加载无法验证的代码的唯一方法是通过禁用验证的完全信任进程(或者可能是应用程序域)。

编辑:我不是在编造这个,one of the C# language designers said "Unverifiable code requires full trust and is generally to be avoided"

【讨论】:

不是我。我也想知道!听起来他们会有更好的建议。由于缺乏解释,我会反驳它【参考方案2】:

已经为时已晚,但它可能对某人有所帮助。

我在我的项目中使用了Sqlite DLL,当我在沙盒环境中部署代码时,我遇到了异常(见下文)

[FileLoadException: Unverifiable code failed policy check. (Exception from HRESULT: 0x80131402)]

[FileLoadException: Could not load file or assembly 'System.Data.SQLite, Version=1.0.79.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139' or one of its dependencies. Unverifiable code failed policy check. (Exception from HRESULT: 0x80131402)]

我在 web.config 文件的 system.web 中添加了trust level,它工作正常。

<trust level="Full|High|Medium|Low|Minimal" originUrl="url"/> 

【讨论】:

我早就放弃了这个项目,所以我无法测试,但很酷!一件事 - 似乎 Full|High|Medium|Low|Minimal 是多余的,而 Full 单独包括其他人。 (我假设此语法对预期枚举类型的值执行按位OR。)【参考方案3】:

这可能不再相关,但我最近遇到了同样的问题。如果您获取流并将其粘贴到临时文件中,则可以使用 Assembly.LoadFrom 加载程序集。

【讨论】:

以上是关于封闭源程序集的“无法验证的代码未通过策略检查”的主要内容,如果未能解决你的问题,请参考以下文章

自考新教材-p222

第一周作业

C语言中如何在源程序中调用另一个源程序中的模块(函数)(自己编写的)?

求一C语言源程序

请设计一个数制转换的C语言源程序

Linux中编写了内核模块的C源程序之后怎么编写makefile文件的内容??