底子
wp7/8應用可以用silverlight技術開發,不懂什麼是silverlight的先默默地學習一分鐘。而silverlight本身就是個精簡的clr + framework,技術完全類似於.net。silverlight的.xap檔案是zip格式的封裝,用7z這樣的工具就能解開。裡面的dll檔案完全是擴充套件的pe格式封裝。熟悉.net的人都知道諸如reflector、ilspy此類的必備工具。在ilspy程式的資料夾裡面有個叫做mono.cecil.dll的檔案,這玩意就是mono專案組搞出來的cecil。簡單說這是個可以生成、注入和檢視符合ecma cil標準的程式集的小專案。更重要的是這個小玩意可以讓你用程式設計的方式實現任何你想要的功能。這時候你應該知道,ilspy就是基於cecil搞出來的,而這篇文章的重點也在於cecil。雖然這個玩意已經有兩年時間沒有更新了,文件也不怎麼適用了,但其依然魅力四射。
開始思路
「技術不是問題」。是的,技術從來都不是問題,問題是你能不能想到解決技術問題的方案。wp7 sdk中獲取地理位置座標要用到geocoordinatewatcher類,通常是在positionchanged事件或直接通過position屬性獲取到座標。而座標都是用geocoordinate表示。好了,我們要做的是在獲取到geocoordinate的**裡面注入一小段**修改它。
假設
注意,這個假設很重要,因為源程式中使用座標的方式直接決定應該如何注入。現假設需要修改的源程式如下
static void watcher_positionchanged(object sender, geopositionchangedeventargse)準備為了讓注入過程盡可能的簡單,我們可以提前在外部把要注入的**寫好並編譯成程式集。寫好如下**,這段**可以根據你的需要隨意修改:
public static class geo注入這一步是把我們準備好的**注入到源程式中。注入之前,先看看源程式的il,看il的目的是為了找到乙個合適的注入點:}
.method private hidebysig static我們要在get_location之後注入我們的**,相當於直接修改了傳遞給writeline的location值。實現的**如下:void watcher_positionchanged (
object sender,
class [system.device]system.device.location.geopositionchangedeventargs`1e
) cil managed
static void main(string args)這時候再用ilspy看看注入之後的**,變成了下面這樣;ad.mainmodule.assemblyreferences.add(anr);
//找到需要注入的類
var hjtype = hjad.mainmodule.types.first(s => s.name == "geo");
//找到需要注入的方法並匯入到需要修改的程式集
var hjmethod = ad.mainmodule.import(hjtype.methods.first(s => s.name == "hijeck"));
//列舉所有的模組
foreach (var module in ad.modules)}}
}//儲存完成注入的程式集
}
private static void watcher_positionchanged(object sender, geopositionchangedeventargse)ps
1、由於本人已經用上了vs2012,但可用的wp sdk還未發布,所以本文所有**都是在fx4.0下模擬的。(fx4.0也有相應的system.device.dll,一樣可用在電腦上進行定位)
2、不同情況需要不同分析,本文**並不通用。實際需要根據不同的情況自己分析il,並注入不同的il,這對操作者的要求較高。
3、對於il不太熟悉的人,可用另外寫個相似的**,修改後比對編譯器給出的不同編譯結果,然後依葫蘆畫瓢。
4、實際的修改中,可能需要同時啟動多個vs,多個專案,額可以在編譯事件中寫入一些指令,例如自動把編譯好的dll複製到另乙個專案中。
5、最後的打包成xap檔案和部署都可以用批處理自動化完成,節約大量人力物力。
6、cecil還有許多更為強大的玩法,本文拋磚引玉,剩下的看你自己了。
WP7 座標變換
在應用開發的過程中,有時需要使用到座標變換 平移,旋轉,縮放,三維變換等 wp7提供了一下幾種座標變換的方式 translatetransform 平移 rotatetransform 旋轉 scaletransform 縮放 skewtransform 傾斜 compositetransform ...
WP7上的Image使用技巧
部分翻譯摘錄自swick的blog 如果不是必須要使用透明,jpg是最好的選擇,wp7的jpg編碼速度要大大快於png resource vs.content 將 或其它種類資源 用何種型別進行xap編譯繫結的時候。resource和content有很大的不同,resource會繫結到dll之中,在...
wp7中的Grid布局方式
wp7中grid布局類似html中的 但是又不太一致 為了測試新乙個3行3列的grid 方了方便,剔除掉其它xaml c sharp collapse view plain copy layoutroot showgridlines true r1 r2 r3 c1 c2 c3 行分別命名為r1,r...