C#中的动态类型提供了其余静态类型语言没法提供的灵活性。自C#4.0(.NET 4.5)引入以来,Dotfuscator与但愿了解有关混淆类型如何影响动态类型的客户进行了合做。ui
Dotfuscator(点击下载最新版)是一个.NET的Obfuscator。它提供企业级的应用程序保护,大大下降了盗版、知识产权盗窃和篡改的风险。Dotfuscator的分层混淆、加密、水印、自动失效、防调试、防篡改、报警和防护技术,为世界各地成千上万的应用程序提供保护。加密
使用动态类型时,编译器会对其成员方法(和/或属性)生成反射调用。这些反射调用使用方法名称的字符串表示形式在运行时调用该方法。混淆后,此字符串必须与方法名称匹配,以免破坏运行时行为。spa
在大多数状况下,使用动态类型的应用程序在Dotfuscator保护它们以后能够正常工做。这是由于动态类型一般解析为Dotfuscator输入中不包含的程序集中定义的类(所以不进行重命名)。这包括来自第三方程序集的类型,来自非托管程序集的类型,以及内置类型-int,bool,string。另外一方面,若是动态类型解析为在Dotfuscator的输入程序集中定义的类型,则须要设置Dotfuscator重命名排除项以保留那些编译器生成的反射调用。3d
可参考如下示例:调试
动态类型解析为MyClass,如咱们的代码中所定义。而后,它从MyClass调用MyMethod。编译完此代码后,请注意,编译器将MyMethod的字符串表示形式加载到要经过反射加载的堆栈上。从MSIL:blog
若是对这些代码进行了混淆而没有重命名排除,咱们将遇到运行时错误:字符串
Unhandled Exception: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'a.a' does not contain a definition for 'MyMethod' at CallSite.Target(Closure , CallSite , Object , String ) at System.Dynamic.UpdateDelegates.UpdateAndExecuteVoid2[T0,T1](CallSite site, T0 arg0, T1 arg1) at a.a() in C:\SampleCode\Dynamic\Dynamic\Program.cs:line 25
为了不此运行时错误,我从重命名中排除了“ MyMethod”。get
若是咱们从MyClass加载属性,则可能会应用相同的想法。在示例的其余地方,有一个动态类型能够解析为内置类型。即便在运行时在int和string之间切换,此代码也能够在没有其余Dotfuscator配置的状况下正常运行:编译器