gpt4 book ai didi

c# - 反编译 VB.Net 程序集会产生具有无效成员变量名称的代码;以 $STATIC$ 开头的名称

转载 作者:行者123 更新时间:2023-11-30 13:10:01 25 4
gpt4 key购买 nike

我正在为丢失了其中一个 VB.Net WinForms 应用程序源代码的客户工作。他们拥有的程序集根本没有混淆。我正在尝试恢复尽可能多的源代码作为 C# 源代码,并尝试了几种用于反编译程序集的工具,包括 Reflector、ILSpy 和 JustDecompile(所有最新版本),但它们都生成了带有大量错误的代码他们。由于生成的代码中有大量错误,我将询问具体的错误(在不同的问题中),希望得到更直接的答案,并以此方式尝试阐明为什么所有工具都难以反编译这个大会。

这个问题涉及到所有这些工具生成的代码总是有大量无效的成员变量(字段),如下所示:

private short $STATIC$Report_Print$20211C1280B1$nHeight;
private ArrayList $STATIC$Report_Print$20211C1280B1$oColumnLefts;
private StaticLocalInitFlag $STATIC$Report_Print$20211C1280B1$oColumnLefts$Init;

谁能解释为什么生成的代码有这些无效的成员变量,我该如何解决这些问题?

最佳答案

这些是由 VB.NET 编译器生成的标识符,用于实现 Static 关键字。例如:

Class Example
Public Sub test()
Static lookhere As Integer = 42
End Sub
End Class

生成这个 IL:

.field private specialname int32 $STATIC$test$2001$lookhere
.field private specialname class [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.StaticLocalInitFlag $STATIC$test$2001$lookhere$Init

通过在字段名中使用保留字母,编译器可以确保永远不会与另一个字段发生意外冲突。在 C# 语言中没有直接等同于 Static 的东西。您可以将它们保留为类中的私有(private)字段,但必须注意初始化。 $Init 标志的目的和大量 IL 确保变量被正确初始化。您需要手动重命名它们。

关于c# - 反编译 VB.Net 程序集会产生具有无效成员变量名称的代码;以 $STATIC$ 开头的名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310331/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com