问题标签 [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.
reflection.emit - PE验证代码?
我正在使用Reflection.Emit
等动态生成程序集。
对于单元测试,我想 PEVerify 我的 IL。
我可以从命令行执行此操作,但我宁愿在代码中执行此操作。
有没有比调用 PEVerify.exe 更方便的方法?理想情况下,我想直接将动态程序集交给它,而不必先将该程序集保存到磁盘。
理想情况下,我正在寻找类似 (psuedocode:
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,并且我不希望在这个平台上出现运行时验证错误。
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 中崩溃?
c# - peverify 错误“堆栈深度因路径而异”
我在peverify
.dll 的发布版本上运行,它给了我错误“堆栈深度因路径而异”:
的代码set_Action
如下:
我不知道为什么这个错误只发生在发布版本中。
c# - 当接口位于可移植类库中时,PEVerify 在显式接口属性上失败
我正在发出一个使用 get 方法显式实现简单接口属性的类。只要接口没有在可移植类库中定义,就没有问题。但是,当将接口移动到 PCL 并仅使用特定类型(如 )时IEnumerable<int>
,PEVerify 将失败。
查看ILDASM -> MetaInfo -> Show,您会看到导入了两个mscorlib
和System.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)
谢谢!
c# - peverify:方法不可见?
我不确定我在这里做错了什么。我正在生成一个使用当前程序集中代码的 dll。这是一个简化版本,仅包含导致问题的代码。
peverify 给出:
这个错误是什么意思?我做错了什么?
谢谢!
编辑:
下面是生成的方法在 ildasm 中的样子:
python - 从 python 调用开发人员命令提示符
如何从 python 脚本调用Developer Command Prompt
附带的Visual Studio 2013
并在其中执行我的peverify
命令。我正在使用 python 3.4。我能够在 windows command prompt
使用中执行命令,subprocess
但不知道如何从开发人员命令提示符中执行此操作。
请帮帮我。我的目标是peverify
通过给定目录中的一组文件执行命令。
c# - PEVerify 可以告诉我每个错误的严重程度吗?
我正在使用 修改程序集Mono.Cecil
,并且我想检查它的有效性(结果是否会运行)。我正在尝试使用PEVerify
,但我遇到了问题。
它旨在确保代码是可验证的,所以它只是说明ERROR
错误是否意味着 IL 完全无效并且不会执行,或者它是否是一个可完全信任的可验证性问题。这里有些例子:
- 使用指针等。
.locals init
当方法有本地人时不设置。.ctor
从非构造方法调用。
导致 IL 无法运行的问题包括:
- 无法从使用成员的位置访问成员。
- 会员不存在。
有没有办法让我知道问题的严重性?如果没有,是否有其他工具可以做到这一点?
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
我不确定这里发生了什么......在我看来它很相似。