将 VB.NET exe 反编译为 C# (dotPeek & JustDecompile)

Decompile VB.NET exe to C# (dotPeek & JustDecompile)

所以我有一个程序是从 VB.NET 构建的,但没有源代码并且不可能获得源代码,我需要修改程序所以我使用 dotPeek 和 JustDecompile 反编译它到 C#,因为我可以用 C# 编写代码,但我从未真正学习过 VB.NET(我也尝试使用 JustDecompile 反编译为 VB.NET,但对我来说它看起来比 C# 更混乱)。但是反编译的项目充满了我在尝试将 C# exe 和 dll 反编译为 C# 项目时看不到的奇怪代码。它充满了看起来不应该存在的代码(看起来像是幕后代码),例如:

private static List<WeakReference> __ENCList;
lock (finvendor.__ENCList)
finvendor.__ENCList.Add(new WeakReference((object) this));
[AccessedThroughProperty("controlname")] //for every controls

它也充满了我在 C# 中找不到的每个控件的此类代码:

internal virtual CheckEdit chkNonAktif
{
  [DebuggerNonUserCode] get
  {
    return this._chkNonAktif;
  }
  [DebuggerNonUserCode, MethodImpl(MethodImplOptions.Synchronized)] set
  {
    EventHandler eventHandler = new EventHandler(this.chk_CheckedChanged);
    if (this._chkNonAktif != null)
      this._chkNonAktif.CheckedChanged -= eventHandler;
    this._chkNonAktif = value;
    if (this._chkNonAktif == null)
      return;
    this._chkNonAktif.CheckedChanged += eventHandler;
  }
}

它使用的是 Devexpress 版本 10,这些代码是因为那个吗?是否正常,或者我可以删除这些代码吗?

您有 VB Winform 项目的调试版本。弱引用内容由调试器使用,不会为发布版本发出。

VB 为每个 Dim WithEvents ControlName As ControlType 创建一个 属性,其中还有一个用 Handles ContolName.EventName 修饰的方法。 属性 setter 包含使 处理事件 工作的事件连接代码。

例如一个按钮和它的点击事件。

Friend WithEvents Button1 As Button

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)  Handles Button1.Click
    'some code
End Sub

将导致生成此 属性:

Friend Overridable Property Button1 As Button
    <CompilerGenerated> _
    Get
        Return Me._Button1
    End Get
    <MethodImpl(MethodImplOptions.Synchronized), CompilerGenerated> _
    Set(ByVal WithEventsValue As Button)
        Dim handler As EventHandler = New EventHandler(AddressOf Me.Button1_Click)
        Dim button As Button = Me._Button1
        If (Not button Is Nothing) Then
            RemoveHandler button.Click, handler
        End If
        Me._Button1 = WithEventsValue
        button = Me._Button1
        If (Not button Is Nothing) Then
            AddHandler button.Click, handler
        End If
    End Set
End Property

您可能还会有许多 类 的名称以 My_XYZ 的形式支持 VB 的应用程序框架。

我建议您使用一些 controls/event 处理程序创建一个新的 VB WinForm 项目,然后对其进行反编译,以便您可以看到反编译器如何重现样板文件内容来自 IL。一旦你知道了模式,就会容易很多。

我的这个答案可以帮助人们理解问题并找到自己的解决方案。

  1. 只需创建您自己的小应用程序,然后将其编译为 .exe 文件。
  2. 然后使用您使用的相同反编译器反编译此 .exe 文件。
  3. 现在你在那里看到了同样的奇怪代码,你知道你没有把它放在那里。

谢谢。