4、测试
运行例子程序,基本代码如下
Pdf417 pdf = new Pdf417();
pdf.Render(text.ToString(), g, rect);
发现
查看混淆过后的dll,使用reflector查看
[LicenseProvider(typeof( . ))] //!!!type后面的类型,是混淆前的类型,混淆后这个类型被改名字了,自然是加载不到此类,运行失败了
public class Pdf417 : MarshalByRefObject, IDisposable
使用Editplus查看 反编译后的 IL代码,查找LicenseProviderAttribute 定位代码的位置
.custom instance void [System]System.ComponentModel.LicenseProviderAttribute::.ctor(class [mscorlib]System.Type) = ( 01 00 03 06 2E 06 )
查看带有LicenseProviderAttribute的没有混淆的dll反编译后IL代码生成规则
Reflector下看
LicenseProvider(typeof(LicFileLicenseProvider)
public class xxx : DataBoundControl, ICallbackEventHandler, IPostBackEventHandler
IL代码,可以看到其实就是完整类名的ascii码。
.custom instance void [System]System.ComponentModel.LicenseProviderAttribute::.ctor(class [mscorlib]System.Type) = (
01 00 77 53 79 73 74 65 6D 2E 43 6F 6D 70 6F 6E // ..wSystem.Compon
65 6E 74 4D 6F 64 65 6C 2E 4C 69 63 46 69 6C 65 // entModel.LicFile
4C 69 63 65 6E 73 65 50 72 6F 76 69 64 65 72 2C // LicenseProvider,
20 53 79 73 74 65 6D 2C 20 56 65 72 73 69 6F 6E // System, Version
3D 32 2E 30 2E 30 2E 30 2C 20 43 75 6C 74 75 72 // =2.0.0.0, Cultur
65 3D 6E 65 75 74 72 61 6C 2C 20 50 75 62 6C 69 // e=neutral, Publi
63 4B 65 79 54 6F 6B 65 6E 3D 62 37 37 61 35 63 // cKeyToken=b77a5c
35 36 31 39 33 34 65 30 38 39 00 00 ) // 561934e089..
可见IL 十六进制代码 一大串,其实表示的就是某个类的完整名字。
这么看来,[LicenseProvider(typeof( . ))] 后面的 typeof 需要换成 xx.2.dll 自己的相关类的名字
查看混淆后的xx.2.dll,找到混淆后的用户license验证的类的名字
查找名称混淆后的.class private auto ansi beforefieldinit xx.2.NS006'.c000055
extends [System]System.ComponentModel.LicenseProvider
{
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 7 (0x7)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [System]System.ComponentModel.LicenseProvider::.ctor()
IL_0006: ret
} // end of method c000055::.ctor
说明此处的类名是xx.2.NS006.c000055 ,经这个类名完全转换成16进制表示的。
78 78 2e 32 2e 4e 53 30 30 36 2e 63 30 30 30 30 35 35
将.custom instance void [System]System.ComponentModel.LicenseProviderAttribute::.ctor(class [mscorlib]System.Type) = ( 01 00 03 06 2E 06 )
替换为
.custom instance void [System]System.ComponentModel.LicenseProviderAttribute::.ctor(class [mscorlib]System.Type) = (
01 00 12 78 78 2e 32 2e 4e 53 30 30 36 2e 63 30 30 30 30 35 35 00 00)
注意 替换格式,前面加01 00 表示开始,最后一个00 00 表示结束,同时,01 00 后面跟着一个字符长度12(十进制18)替换了五处,分别对应了五个组件。
这么修改后,不再出现上述错误提示。
继续测试组件,基本正常,但是出现了错误