问题标签 [peverify]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
396 浏览

reflection.emit - PE验证代码?

可能重复:
是否有用于在运行时验证动态程序集的 MSIL 的 API?

我正在使用Reflection.Emit等动态生成程序集。

对于单元测试,我想 PEVerify 我的 IL。

我可以从命令行执行此操作,但我宁愿在代码中执行此操作。

有没有比调用 PEVerify.exe 更方便的方法?理想情况下,我想直接将动态程序集交给它,而不必先将该程序集保存到磁盘。

理想情况下,我正在寻找类似 (psuedocode:

0 投票
0 回答
244 浏览

clr - peverify .NET 4 中修复的错误?

我安装了 VS .NET 2010,以及一个面向 .NET 3.5 的类库。下面的简单 C# 片段在 .NET 4.0 的 peverify 下生成可验证的 IL,但 IL 不使用 .NET 3.5 的 peverify 进行验证。

在此过渡中是否修复了任何 peverify 错误?

产生的错误是:

我显然有点担心,因为我明确针对 .NET 3.5,并且我不希望在这个平台上出现运行时验证错误。

0 投票
2 回答
509 浏览

.net - 为什么这个 .Net IL 无法验证?

我编写了一些自定义 IL,但它不会通过 PEVerify。我得到的错误是

然而,该程序将运行良好,没有任何异常。下面是相关方法的IL:

完整的源代码在pastebin

为什么我会收到此错误?

0 投票
1 回答
2370 浏览

clr - 为什么带有 PEVerified Stack Overflow Scenario (maxstack) 的程序不会导致 CLR 崩溃?

我可以编写、编译并成功运行以下 IL 程序,其中 .maxstack 大小设置为 1,这太低了,因为该程序在某个时间点在堆栈上有两个值(即 2+2==4)。该程序不会在 CLR 中崩溃,并以“Hello World”的所有预期输出后跟数字 4 完成执行。

但是,该程序将(正确地)不通过 PEVerify,它指出堆栈溢出异常,并显示以下消息:

Microsoft (R) .NET Framework PE 验证程序。版本 4.0.30319.18020 版权所有 (c) Microsoft Corporation。版权所有。

[IL]:错误:[C:\tmp\hello.exe:HelloWorld1.Program::Main][offset 0x00000011] 堆栈溢出。1 验证 hello.exe 的错误

为什么它不会在 CLR 中崩溃?

0 投票
1 回答
218 浏览

c# - peverify 错误“堆栈深度因路径而异”

我在peverify.dll 的发布版本上运行,它给了我错误“堆栈深度因路径而异”:

的代码set_Action如下:

我不知道为什么这个错误只发生在发布版本中。

0 投票
1 回答
219 浏览

c# - 当接口位于可移植类库中时,PEVerify 在显式接口属性上失败

我正在发出一个使用 get 方法显式实现简单接口属性的类。只要接口没有在可移植类库中定义,就没有问题。但是,当将接口移动到 PCL 并仅使用特定类型(如 )时IEnumerable<int>,PEVerify 将失败。

查看ILDASM -> MetaInfo -> Show,您会看到导入了两个mscorlibSystem.Runtime程序集引用。这发生在调用DefineMethodOverride(watch AssemblyBuilder.GetReferencedAssemblies()to see) 期间。您还可以看到 IEnumerable`1 作为 TypeRef 从两个程序集中引入,这似乎是问题所在。

当不将接口分离到 PCL 时,或者将类型更改为其他类型时,它可以工作并且System.Runtime不包括引用。要尝试string,请在界面中替换IEnumerable<int>withstring以及DefineProperty/DefineMethod调用。

使用MSDN中的修改示例作为重现此问题的简化方法,将下面的代码放入控制台项目中,一切正常。移动interface I到一个可移植的类库项目,你会明白我的意思。

如何摆脱 PEVerify 错误?

错误:MethodImpl 的 Decl (token=0x0a000001) 和 Body (token=0x00610072) 方法签名不匹配。[令牌:0x19000001] [小时:0x801312F4]

(.Net 4.5.1)

(PEVerify 和 ILDASM 版本 4.0.30319.33440 来自 C:\Program Files (x86)\Microsoft SDKs\Windows\v8.1A\bin\NETFX 4.5.1 Tools\x64)

谢谢!

0 投票
1 回答
653 浏览

c# - peverify:方法不可见?

我不确定我在这里做错了什么。我正在生成一个使用当前程序集中代码的 dll。这是一个简化版本,仅包含导致问题的代码。

peverify 给出:

这个错误是什么意思?我做错了什么?

谢谢!

编辑:

下面是生成的方法在 ildasm 中的样子:

0 投票
2 回答
1118 浏览

python - 从 python 调用开发人员命令提示符

如何从 python 脚本调用Developer Command Prompt附带的Visual Studio 2013并在其中执行我的peverify命令。我正在使用 python 3.4。我能够在 windows command prompt使用中执行命令,subprocess但不知道如何从开发人员命令提示符中执行此操作。

请帮帮我。我的目标是peverify通过给定目录中的一组文件执行命令。

0 投票
1 回答
160 浏览

c# - PEVerify 可以告诉我每个错误的严重程度吗?

我正在使用 修改程序集Mono.Cecil,并且我想检查它的有效性(结果是否会运行)。我正在尝试使用PEVerify,但我遇到了问题。

它旨在确保代码是可验证的,所以它只是说明ERROR错误是否意味着 IL 完全无效并且不会执行,或者它是否是一个可完全信任的可验证性问题。这里有些例子:

  1. 使用指针等。
  2. .locals init当方法有本地人时不设置。
  3. .ctor从非构造方法调用。

导致 IL 无法运行的问题包括:

  1. 无法从使用成员的位置访问成员。
  2. 会员不存在。

有没有办法让我知道问题的严重性?如果没有,是否有其他工具可以做到这一点?

0 投票
1 回答
691 浏览

c# - 将 callvirt 更改为在 IL 中调用

在一些 IL 实验中,我尝试将callvirt程序集中的调用更改为call方法。基本上发生的事情是我有一个带有我正在调用的成员函数的继承链。

基本上调用是这样的:

或在 IL

基类定义SomeCall为抽象方法,派生类实现它。派生类是密封的。

我知道这callvirt基本上相当于检查对象是否为空,如果它没有使用 vtable 调用方法,如果是,则抛出异常。就我而言,我知道它永远不会null,我知道那是我想要调用的实现。callvirt我理解为什么在这种情况下您通常需要 a 。

也就是说,因为我知道对象永远不会为空,并且始终是派生类型的实例,所以我认为这不是问题:

  • 当您考虑将数据和类型分开时,我实际上认为 (**1) 可以删除(对象的数据将相同)并且
  • 那 (**2) 可以是一个简单的call,因为我们确切地知道要调用哪个成员。不需要 vtable 查找。

在我看来,编译器在某些情况下也可以推断出相当合理的事情。对于那些感兴趣的人,是的callvirt,虽然速度非常小,但速度会受到惩罚。

然而。PEVerify 告诉我这是错误的。作为一个好孩子,我总是注意 PEVerify 告诉我的内容。那么我在这里错过了什么?为什么更改此调用会导致不正确的程序集?


显然创建一个最小的测试用例并不是那么简单......到目前为止,我没有太多运气。

至于问题本身,我可以简单地在一个更大的程序中重现它:

值的 IL 代码:

该字段的类型是NubiloSoft.Test

至于Contains,它在基类中是抽象的,而在派生类中则被覆盖。正如你所期望的那样。当我删除“抽象基础方法”+“覆盖”时,PEVerify 再次喜欢它。

为了重现这个问题,我这样做了,到目前为止没有运气在一个最小的测试用例中重现它

当您运行它并调用 peverify 时,它会告诉您代码没有错误... :-S

我不确定这里发生了什么......在我看来它很相似。