WP7 DOES NOT SUPPORT REFLECTION.EMIT AND MONO CECIL!
To save image in WP7, you need to use ImageTools and save to PNG file – which is compatible with WP7
ขอจั่วหัวไว้ก่อนเลยครับ เผื่อใครมาเปิดเจอเข้า
ถามว่า ทำไมถึงไม่ Support ถ้าให้ผมตอบ ก็คงเพราะว่าเขาต้องการป้องกันไม่ให้เราสามารถโหลด Assembly ที่ไม่ผ่านการตรวจสอบจาก Marketplace ได้นั่นเองครับ
เพราะว่า ระบบการ โหลด Assembly ของ .NET นั้นดีมาก (ไม่ได้เข้าข้าง) จนเราสามารถ สร้าง Assembly ของ Application แบบ Dynamic ขึ้นมาด้วยโปรแกรม C# แล้วสั่งรันได้เลย ซึ่งจะเหมาะมากสำหรับระบบที่ต้องการความปลอดภัยสูง เช่น Gen Assembly สำหรับรัน บนเครื่องที่มี CPU ID นี้ เท่านั้น หรือ ระบบ Licensing เช่น ถ้าเราซื้อ 3/5 Feature ระบบก็จะ สร้าง Assembly แบบสดๆ บนแรม ที่มีแค่ 3 Feature (ป้องกันการไปแก้ไฟล์ใน Disk) มาให้โปรแกรมรันอีกที อะไรทำนองนั้น
นอกจากนี้ การที่สามารถ Gen Assembly หรือใช้ Reflection.Emit พ่น OpCode ออกมาให้ CLR รันได้แบบ Dynamic ก็ยังมีส่วนช่วยในเรื่องประสิทธิภาพได้ด้วย เช่น กรณีของ ตัว Decode/Encode JPEG ในโปรเจค FJCore ที่ใช้ Reflection.Emit สร้างตัว Quantizer เป็นต้น (ผมไม่รู้หรอก ว่ามันคืออะไร แต่อ่านโค๊ดแล้ว มัน Gen ตัวนี้สำหรับ Decode/Encode แต่ละภาพเลยอะ เหอๆ)
ทำไมใช้ไม่ได้?
อย่างแรกเลย คือ Reflection.Emit นั้น ต้องใช้สิทธิ์ขั้นสูงครับ ถึงจะใช้ได้ WP7 ได้ แต่นั่นก็ไม่ได้หยุดเราครับ MVP ท่านหนึ่ง ชื่อว่า Michael Sync เสียสละเวลา ทำการ Port Mono.Cecil ซึ่งเป็น Library ที่ทำงานคล้ายกับ Reflection.Emit คือ เราสามารถสร้าง Assembly แบบ Dynamic ขึ้นมา โดยการเขียนลงไปเป็นไบต์ๆ ใน Byte Array เลย แล้วใช้ AssemblyPart.Load ซึ่งรับ byte[] โหลดเอา
แต่จุดตาย ก็มาจบที่…
คลาส AssemblyPart ซึ่งเราจะใช้ในการ Load Assembly สำหรับกรณีของ Silverlight นั้น ดันไม่มี Function Load และ
System.Reflection.Assembly นั้น ก็ต้องการ Elevated Permission ซึ่งเดาว่า ต้องส่งโปรแกรมเราไป Sign ก่อน ถึงจะได้นั่นแหละ
แล้วมาเขียนบอกทำไม
เพราะว่า ถ้าคุณต้องการจะเซฟภาพ เป็น JPEG บน WP7 ด้วย Managed Code นั่นก็คือใช้ Library FJCore มันจะทำไม่ได้ครับ อย่าพยายาม Port มัน ตัวที่ใช้ได้ คือ Image Tools และต้องเซฟเป็น PNG ครับ :)
ตอนนี้ผมได้ถามคุณ Michael Sync ไปแล้ว เดี๋ยวรอเขาตอบมาทีว่า จะใช้ได้ยังไง เผื่อผมพลาดอะไรไป :)