我们使用vb.net开发了一个项目,用于我们的内部目的,然后我们混淆了它。它抛出如下所述的错误。
"找不到类型为' e '的公共成员' Var1 ' . "
代码: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)从调用过程传递给参数' from '到子例程。Var1等都是这种形式的公共变量。
我们尝试过的混淆工具有-
SmartAssembly 6
PreEmptive Dotfuscator and Analytics CE (Visual studio 2012自带)
没有混淆,exe工作正常。
在子例程中分配变量' Var1 '时抛出错误。如果代码行修改如下,则obfuscated exe将正常工作。
FrmMain。Var1 =行("ChangesDbName")。ToString
我们认为混淆缺少后期绑定&在一个小样本项目中尝试了类似类型的代码。但这没有任何误差。我们附上了这个小代码。但是由于它的大小,我们不能上传原始项目。
我们如何追踪错误?
您可以在这里找到我的示例应用程序的源代码
不要在反射/延迟绑定/动态中使用混淆。这只会给你带来这样的麻烦。
混淆器将混淆所有私有&内部标识符,但它不能知道您在运行时通过名称绑定到它们。
打开Option Strict
并解决错误(即将参数的类型从其实际类型更改)
混淆器依赖于静态分析来确定什么是"安全的"混淆。当您将延迟绑定和反射引入其中时,很难检测到重命名不安全的内容。大多数混淆器都提供了将应用程序的某些元素排除在混淆之外的功能,这样您就可以解决这个问题。
我其实不懂VB。Net非常好,但是您所做的延迟绑定的方式似乎是混淆器无法检测到的。因此,这意味着您需要将该属性排除在重命名之外。至少在Dotfuscator中,这应该很容易。你还应该能够打开"库模式",它将自动排除每个类的所有公共成员。