0

我们出于内部目的使用 vb.net 开发了项目,然后我们对其进行了混淆。它抛出错误,如下所述。

“未找到类型 'e' 上的公共成员 'Var1'。”</p>

代码:

Public Sub get_constants_from_DbList(ByRef frm As Object, ByRef sDbname As String)

    For Each Row As DataRow In CommonObj.DSCommonProc.Tables("dblist").Rows 
            If StrComp(Row("DbName").ToString, sDbname, CompareMethod.Text) = 0 Then
             prg_id = Row("PrgId").ToString
             frm.Var1= Row("ChangesDbName").ToString
             frm.Var2 = Row("LoadTableName").ToString
             frm.Var3 = Row("ServerName").ToString
             Exit Sub
        End If
    Next

End Sub

一个表单(名为 FrmMain)从调用过程传递给参数“frm”到该子例程。Var1 等是这种形式的公共变量。

我们尝试过的混淆工具是——

  1. 智能装配 6

  2. PreEmptive Dotfuscator and Analytics CE(随 Visual Studio 2012 提供)

没有混淆 exe 工作正常。

在子例程中分配变量“Var1”时引发错误。如果代码行如下修改,则混淆的 exe 将正常工作。

FrmMain.Var1= Row("ChangesDbName").ToString

我们认为混淆缺少后期绑定并在一个小型示例项目中尝试了类似类型的代码。但这没有任何错误。我们附上了这个小代码。但由于其规模,我们无法上传原始项目。

我们如何追踪错误?

你可以在这里找到我的示例应用程序的源代码

4

2 回答 2

1

不要对反射/后期绑定/动态使用混淆。它只会让你陷入这样的麻烦。

混淆器将混淆所有私有和内部标识符,但它无法知道您在运行时通过名称绑定到它们。

打开Option Strict并解决错误(即将参数frm的类型更改为其真实类型)

于 2013-04-04T07:18:51.400 回答
0

混淆器依靠静态分析来确定什么是“安全”的混淆。当您在混合中引入后期绑定和反射时,很难检测到重命名不安全的东西。大多数混淆器提供了将应用程序的某些元素从混淆中排除的能力,以便您可以解决此问题。

我实际上不太了解 VB.Net,但是您进行后期绑定的方式似乎是混淆器无法检测到的。因此,这意味着您需要将该属性排除在重命名之外。至少在 Dotfuscator 中,这应该很容易。您还应该能够打开“图书馆模式”,这将自动排除每个班级的所有公共成员。

于 2013-04-04T20:13:54.013 回答