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配置的狀況下正常運行:編譯器