Silverlight自從MS給世界多媒體各路神鬼驚喜以來,一直存在一個似有似無的問題.許多SL愛好者因為在某網站看到自己喜歡的樣本就想方設法把它的原代碼或不管三七二十一把有關的資源全拿下(.xap就那麼 兩個檔案dll和app.xaml).為此我也是其中之一,下面總結一下個人學習的有爭議的合法途徑(有著作權歸屬問題與我無關,有SL開發人員持意見者可以原諒)!
1.開啟http://www.pin5i.com/showtopic-26213.html 這有個silverlight局部圖片放大效果的樣本;
2.查看網頁"源檔案",找到src="http://www.pin5i.com/demo/26213/demo.html" (這個網站的SL資源很隱蔽呀,一般很難發現哦!) ;
3.之所以有2步驟,是因為某些資源發行者故意把源來的資源隱藏得比較深,這樣就不會被輕易擷取了.總之只要找到真正的樣本源URL即可;
4.開啟http://www.pin5i.com/demo/26213/demo.html 這裡面就有這個樣本,查看網頁"源檔案",發現
<param name="source" value="PartMagnifier.xap"//> (其實許多網站的資源檔通常放置在樣本網頁的同一層,比如http://www.after8creative.com/ClientBin/WorkExamples.xap 這個頁面可以下載其.xap,而http://www.after8creative.com/正好是它的樣本頁面.它的頁面源碼如下:<param name="source" id="applicationName" value="ClientBin/WorkExamples.xap" />
只需要把value複製到http://www.after8creative.com/後面即可解決!)好了我們要的就是這個http://www.pin5i.com/demo/26213/PartMagnifier.xap 將其下載下來,重新命名為.rar檔案,解壓,發現AppManifest.xaml與PartMagnifier.dll檔案;5.從reflector(Silverlight反編譯工具).zip下載一個迷你的silverlight專用dll反編譯器,將PartMagnifier.dll檔案open,找到的四個檔案:其實所有的.xap包裡都包含這個資源的資訊(About),比如有一個資源的包裡的AppManifest.xaml的源為:代碼
<Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" EntryPointAssembly="ScatterViewSample" EntryPointType="ScatterViewSample.App" RuntimeVersion="3.0.40624.0">
<Deployment.Parts>
<AssemblyPart x:Name="ScatterViewSample" Source="ScatterViewSample.dll" />
<AssemblyPart x:Name="Firebrick.SilverlightTouch" Source="Firebrick.SilverlightTouch.dll" />
</Deployment.Parts>
</Deployment>
說明有兩個dll中有一個反編譯後發現是被另外一個調用的:
明顯References引用了第二個dll(Firebrick.SilverlightTouch.dll);其實用reflector反編譯出來的每個.xap包裡面的每個dll(無加密無特殊狀況)無非兩種東西:前台(Resources)與後台(以項目名稱為標題的部分)6.有些特殊狀況不得不說明:reflector反編譯出的使用者自訂控制項(UserControl)後台代碼部分,reflector會將其中的頁面屬性當成方法來使用(如:this.img.Set_Stretch(1); img是Image,它有個屬性Stretch有四個可選值分別為Fill/None/Uniform/UniformtoFill,分別代表序號0/1/2/3,所以this.img.Set_Stretch(1)這名其實是 表達this.img.Stretch=Stretch.None的意思). 另外:有些執行個體化建立對象時反編譯器會把語句給簡略掉如:代碼
private static void OnBehaviorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Particles particles = d;
........
}
原來的格式是:
代碼
private static void OnBehaviorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
Particles particles = d as Particles;
........
}
後者顧名思義才是正確的!7.將上面的xaml檔案與cs檔案都儲存到需要的檔案夾下即可,最後有VS開啟檔案(嚴格要求做法:1.建立新(silverlight)項目;2.參照反編譯dll出現的各種類或方法的代碼一一建立到或複製粘貼到建立項目中(而不是單純的複製粘貼檔案那麼簡單!)).8.若涉侵權行為,請forgive;切勿模仿,本人只為了給silverlight的發展給以更好的反面問題.出處:http://www.cnblogs.com/molin/archive/2010/03/01/silverlight_debug.html