Obfuscar混淆后自定义控件TypeName被混淆的解决问询
自定义控件TypeName被Obfuscar混淆的解决方法
在VB.Net应用程序AppliTest里用了自定义用户控件PlusMinus,程序逻辑依赖控件的TypeName判断处理逻辑。混淆前TypeName显示正常,比如c.Name=PM_Large c.Type=PlusMinus;但用Obfuscar混淆后,控件实例名称没问题,TypeName却被改成了类似“뢕”的乱码字符,Label、TextBox这类系统控件不会出现这个问题。
当前使用的Obfuscar配置如下:
SkipType name="AppliTest .PlusMinus" Var name = "KeepPublicApi" value="false" Var name = "HidePrivateApi" value="true" Var name = "RenameProperties" value="true" Var name = "RenameFields" value="true" Var name = "UseUnicodeNames" value="true" Var name = "HideStrings" value="true" Var name = "OptimizeMethods" value="true" Var name = "ReuseNames" value="true" Var name = "UseKoreanNames" value="true"
几种可行的解决方案
1. 修正SkipType并添加针对性的KeepName规则
首先你的SkipType配置里类名多了个空格(AppliTest .PlusMinus),这会导致规则不生效,先去掉空格。然后添加规则保留TypeName相关的成员:
<!-- 修正类名空格,确保匹配到目标控件 --> SkipType name="AppliTest.PlusMinus" <!-- 保留TypeName属性 --> KeepName type="AppliTest.PlusMinus" name="TypeName" <!-- 如果代码里是通过GetType().Name获取类型名,还需要保留类型的Name属性 getter --> KeepName type="AppliTest.PlusMinus" name="get_Name"
2. 调整全局混淆参数(适合需要保留大量公共类型的场景)
把KeepPublicApi改成true,这样公共类型的名称不会被混淆,但会降低整体混淆强度:
Var name = "KeepPublicApi" value="true"
3. 代码层面绕过TypeName依赖
在自定义控件里加一个固定的标识属性,替代TypeName做逻辑判断,这样不管类型怎么混淆,标识都不会变:
Public Class PlusMinus Inherits UserControl Public ReadOnly Property ControlType As String Get Return "PlusMinus" End Get End Property ' 其他控件代码... End Class
之后程序里用c.ControlType代替c.TypeName做判断即可。
内容的提问来源于stack exchange,提问作者Pierre56
相关产品推荐
相关产品推荐

