- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在混淆一个程序集,混淆后 PEVerify 发出以下错误:
[MD]: Error: Method has a duplicate, token=0x060035d8. [token:0x060035D5]
[MD]: Error: Method has a duplicate, token=0x060035d5. [token:0x060035D8]
这是第一个带有标题的方法声明:
// Token: 0x060035D5 RID: 13781 RVA: 0x000D7828 File Offset: 0x000D5A28
.method private final hidebysig newslot virtual
instance void b () cil managed
{
.override method instance void [mscorlib]System.IDisposable::Dispose()
// Header Size: 12 bytes
// Code Size: 52 (0x34) bytes
// LocalVarSig Token: 0x11000050 RID: 80
.maxstack 2
.locals init (
[0] int32
)
这是第二个:
// Token: 0x060035D8 RID: 13784 RVA: 0x000248BC File Offset: 0x00022ABC
.method private hidebysig
instance void b () cil managed
{
// Header Size: 1 byte
// Code Size: 31 (0x1F) bytes
.maxstack 8
对我来说,这似乎是一个明确的 IDisposable 接口(interface)实现。这两种方法也会被调用,因此并不是所有对一个方法的调用都被对另一个方法的调用所取代。他们只是同名而已
如果用 C# 编写了类似的代码 - 编译器将发出方法 System.IDisposable.Dispose() 和 Dispose() 从而消除相同的名称并使 PEVerify 静默。
为了确保相同的名称在其中一个是接口(interface)方法的显式覆盖而另一个不是时成为有效的 IL,我编写了这样的示例应用程序:
namespace ClassLibrary1 {
public interface IX { void M(); }
public class Class1 : IX {
void IX.M() { Console.WriteLine("IX.M()"); }
public void M() { Console.WriteLine("M()"); }
}
public class Class2 {
public static void Main(string[] args) {
var x = new Class1();
x.M();
((IX)x).M();
}
}
}
IL 看起来像这样:
// Token: 0x06000002 RID: 2 RVA: 0x00002050 File Offset: 0x00000250
.method private final hidebysig newslot virtual
instance void ClassLibrary1.IX.M () cil managed
{
.override method instance void ClassLibrary1.IX::M()
// Header Size: 1 byte
// Code Size: 13 (0xD) bytes
.maxstack 8
/* 0x00000251 00 */ IL_0000: nop
/* 0x00000252 7201000070 */ IL_0001: ldstr "IX.M()"
/* 0x00000257 280F00000A */ IL_0006: call void [mscorlib]System.Console::WriteLine(string)
/* 0x0000025C 00 */ IL_000B: nop
/* 0x0000025D 2A */ IL_000C: ret
} // end of method Class1::ClassLibrary1.IX.M
// Token: 0x06000003 RID: 3 RVA: 0x0000205E File Offset: 0x0000025E
.method public hidebysig
instance void M () cil managed
{
// Header Size: 1 byte
// Code Size: 13 (0xD) bytes
.maxstack 8
/* 0x0000025F 00 */ IL_0000: nop
/* 0x00000260 720F000070 */ IL_0001: ldstr "M()"
/* 0x00000265 280F00000A */ IL_0006: call void [mscorlib]System.Console::WriteLine(string)
/* 0x0000026A 00 */ IL_000B: nop
/* 0x0000026B 2A */ IL_000C: ret
} // end of method Class1::M
注意不同的方法名称。
然后我得到了生成的 exe 并编辑了 ClassLibrary1.IX.M
只是 Class1
中的 M
(我已经使用 dnSpy 来去做)。 PEVerify 确实开始发布关于重复方法的相同问题,但 exe 仍然按预期正常打印 M() IX.M()
。
问题是 PEVerify 在这里是否过于谨慎,或者我没有看到重合名称真的存在问题?
最佳答案
这两种方法共享相同的方法签名,这是不允许的。
For the CLR, a method signature consists of the method name, generic arity, formal parameter arity, formal parameter types and kinds, and return type.
Definition of a method signature
Serge Lidin 在 .Net IL Assembler 第 10 章 Method Table Validity Rules 中指出:
No duplicate records—attributed to the same TypeDef and having the same name and signature—should exist unless the accessibility flag is privatescope.
当然,您可以在 ECMA-335 规范的 II.22.1 分区中找到这条规则:
Unique Rows: No table shall contain duplicate rows, where “duplicate” is defined in terms of its key column, or combination of columns.
关于c# - PEVerify 关于重复方法的警告在这里是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35157288/
我正在混淆一个程序集,混淆后 PEVerify 发出以下错误: [MD]: Error: Method has a duplicate, token=0x060035d8. [token:0x0600
给定PEVerify如下所示的错误和警告输出,如何追溯到有问题的类和接口(interface)名称?假设我不是编译器作者或 IL 魔术师。 [MD]: Error: Class implements
我遇到了 InvalidProgramException。本文: http://support.microsoft.com/kb/312544/en-us 建议我运行 PEVerify.exe,但我似
此代码验证失败: .assembly extern mscorlib {} .assembly Program {} .method private static void Main() cil ma
我偶然发现了一些奇怪的事情:我得到了一个 BadImageFormatException,但不知道它可能指的是什么图像(程序集)。 我缩减了解决方案,使其只包含一个没有依赖项的项目: 如您所见,它仅使
我正在开发一种编译器,它在某些扩展生成器的情况下会产生错误的输出。 PEVerify 只是说“Type load failed”而没有给出任何解释原因。当我过去看到这种情况时,通常是因为生成的类型具有
我在验证一些包含返回指针的不安全方法的代码时遇到了这个问题。 例子可以这样表示: public class A { public static unsafe int* GetAnswer()
我是一名优秀的程序员,十分优秀!