1

所以我有一个从 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,这些代码是因为这个吗?这是正常的还是我可以删除这些代码?

4

2 回答 2

2

你有一个调试版本的 VB Winform 项目。弱引用的东西由调试器使用,不会为发布版本发出。

VB 为每个属性创建一个属性,Dim WithEvents ControlName As ControlType还有一个用Handles ContolName.EventName. 属性设置器包含使Handles Event工作的事件连接代码。

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

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 的应用程序框架。

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

于 2018-05-23T13:50:18.107 回答
0

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

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

谢谢。

于 2019-01-12T11:02:15.107 回答