我希望使用 Dotfuscator 对我的程序集文件(*.dll,*.exe)进行混淆。我的问题是,如果我这样做,是否仍然可以按照它们在混淆前的原始名称(即混淆之前的名称),并且使用
System.Reflection
方法与这些类和类型进行交互?System.Reflection
方法与这些类和类型进行交互?混淆和反射可能会给您带来一些问题。即使您采用了使用选项不混淆公共方法的建议,某些反射代码可能会调用私有方法。问题在于混淆将更改某些可能需要保持相同的代码名称。
如果您知道或可以定位易受反射使用的区域,则可以使用
[global::System.Reflection.Obfuscation(Exclude=true, Feature="renaming")]
这将告诉混淆器保留名称。
使用反射运行混淆需要更多的测试,但仍然可行...
例如在这里阅读http://msdn.microsoft.com/en-us/library/ms227298(v=vs.80).aspx。有一个“库模式”可以禁用公共成员的混淆。否则,您可能无法访问这些方法。有一种属性可以控制类型级别的混淆:http://msdn.microsoft.com/en-us/library/ms227281(v=vs.80).aspx
您可以在混淆的程序集上使用 System.Reflection
,但由于混淆的某些目的是将程序集中的所有内容重命名为随机和无意义的名称,因此您不能像在非混淆的程序集中那样对相同的名称和标识符进行反射。如果您想要在混淆的程序集上执行反射操作,您需要以一种不依赖于类型和成员被命名的方式来执行。
您可以创建自己的私有映射表,以获取旧名称的新名称。 Mapper必须将以下结构的表写入磁盘/数据库: 模块(可执行文件),索引,原始类型,混淆类型
创建“Mapper”控制台应用程序,根据参数操作两种模式: 该应用程序将作为参数接收可执行文件路径
现在,您需要一个函数来从OriginalName获取ObfuscatedName,然后就完成了。
请注意,此解决方案无法与修剪一起使用,因为类型的数量将发生变化,并且索引将不再匹配
OriginalAssembly.GetTypes()
并且
ObfuscatedAssembly.GetTypes()