Ruby 板


LINE

不知道這篇可不可以發在這,不過這是一個想用IronRuby開發WPF的人的嘗試心得 -----正文----- 搞了N天終於成功了,趕快來筆記一下 目的: 想靠IronRuby建立WPF應用程式(利用XAML),而且還想要編譯成exe檔以便散播 想法: 藉由C#去呼叫IronRuby,再利用C#編譯 首先,開啟Visual Studio建立C#專案(我用Console專案,不過沒差) 然後把該加進來的"參考"(就是.NET的library)加進來: IronRuby, IronRuby.Libraries, IronRuby.Libraries.Yaml //IronRuby Microsoft.Scripting, System, System.Xaml, Windows.Base PresentationCore, PresentationFramework //WPF (我還多引入一個 Microsoft.CSharp,不過我想應該沒差) 然後建立一個ruby file "wpf.rb": require "PresentationFramework" require "PresentationCore" xaml = File.read("test.xaml").gsub(/\A[^<]*/,"") # 砍掉討厭的BOM (3 bytes) @root = System::Windows::Markup::XamlReader.parse xaml @root.find_name("button").click do |s, e| @root.find_name("msg").text = "Changed!" end app = System::Windows::Application.new app.run @root 在建立一個xaml file "test.xaml": <Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <StackPanel> <TextBlock x:Name="msg" Text="Hello, WPF!" /> <Button x:Name="button">Click!</Button> </StackPanel> </Window> 最後建立一個C# file "IronRubyFromCSharp.cs": using Microsoft.Scripting.Hosting; using IronRuby; using System.Threading; namespace IronRubyFromCSharp { class IronRubyFromCSharp { public static void Main(string[] args) { Thread thread = new Thread(() => { var engine = Ruby.CreateEngine(); engine.ExecuteFile("wpf.rb"); }); thread.SetApartmentState(ApartmentState.STA); thread.Start(); } } } 好了,接下來我們必須要讓Visual Studio知道哪些檔案是需要包進安裝程式 在右方的方案總管(Solution Explorer)面板選取ruby, xaml檔案,右鍵看屬性 然後在屬性面板裡的"建置動作"中選取"內容" 然後再打開"專案"(Project)的屬性(不是"方案"(Solution)!!) 點選最下面的發行,有個"應用程式檔案"的按鈕 把裡面的東西都改成包含(避免客戶端沒有IronRuby) 而且可以把剛剛的建立的檔案加進安裝程式 最後就發行看看咯~ -----解說----- 好唄,我們來看一下為什麼一個簡單的WPF程式會變得這麼複雜 最終的其實只有一個文字+一個按鈕,按鈕按下去會改變文字的內容 不過我要省略C#&WPF&XAML基礎知識,這篇的重點是IronRuby,因此我只大略說 WPF建議使用XAML來畫應用程式的介面,XAML的內容應該很好懂 首先是ruby file: 把WPF必要檔案require進來:"PresentationFramework","PresentationCore" xaml = File.read("test.xaml").gsub(/\A[^<]*/,"")就是讀取XAML,順便砍掉BOM @root = System::Windows::Markup::XamlReader.parse xaml就是把xaml拿去parse 此時的@root就是一個System.Windows.Window物件 //請見XAML內容 再把@root扔給System.Windows.Application去run就行了 所以後面就看到 app = System::Windows::Application.new app.run = @root 如果是直接用ir去interpret IronRuby檔案的話,這樣就行了 不過我們需要C#的編譯,所以在看到C#檔案: 前面就是using .NET library: Script Host & IronRuby 我們多using一個System.Threading,這是有原因的 WPF需要在"單一執行緒Apartment"(STA)中執行(別問我為什麼= =,我猜是怕干擾) 所以直接去呼叫IronRuby是不行的! 因此我們建立一個Thread,把呼叫IronRuby的工作交給它 設定Thread為STA,再讓它執行 終於大功告成了!!! -----來列一下我遇到的瓶頸----- ˙Debug時可以讀到ruby file,發行時跳出LoadError ˙用Visual Studio建立的檔案有BOM,但是parse出錯時只顯示XamlParseException ˙砍掉BOM後去run,跳出"執行緒須為STA,因為很多UI元件都需要STA" -----後記----- 根據網路上的回答,STA這個設定似乎從.NET以前就有了,大部分程式要求STA 不過,我跟Windows Application不熟XD --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 125.228.42.170
1F:推 hst1805:有趣的研究不過好奇怎樣的需求要用ironRuby+WPF? 03/17 14:33
2F:→ mars90226:大概就是把好用的gem搬過來吧XD 03/17 15:57
3F:→ mars90226:Rails也可以啊~ 03/17 15:57
4F:→ ryudo:GJ! 03/26 16:45
5F:推 ireullin:推^^ 10/09 17:31







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BuyTogether站內搜尋

TOP