有研究了三個多小時,終於搞定了,寫完博客一定要去休息會。。。。
csc,相信有一部分人肯定了解或者用過。csc,是C#的編譯器,通過一些的參數達到編譯CS文件為可執行文件的目的。
百度上有一些csc的內容,但並沒有關於csc編譯器編譯生成WPF應用的,因此特寫此文,並非重復寫很多遍的東西。
使用csc編譯WPF程序,目的有二:
1.有助於提高對WPF的理解,這與用WPF模板新建一個WPF項目是截然不同的,當你利用模板新建一個WPF程序,Application和Window窗口早就給你生成了,雖說方便,但最后的結果就是你連WPF是怎么運行的都不知道。
2.當你在未安裝VS但安裝了.Net的計算機中需要編程的時候,可以使用此方法。(這只是個簡單的例子,其他的東西就靠各位繼續研究了)
使用CSC ,首先是要添加csc.exe文件路徑(位於你的系統.Net任何一個版本的安裝目錄:如:C:\Windows\Microsoft.NET\Framework\v4.0.30319)到系統環境變量的path路徑中,只要學過Java的應該都會配置的,不會的要去百度。
配置完成之后,(重新)打開命令提示符,定位到你將要編譯程序的那個文件夾。要說編譯C#程序,定要有cs文件。所以就新建一個文本文件並命名為1.cs,用文本編輯器打開它(記事本也湊合),在其中輸入C#代碼,然后在命令提示符中輸入:
csc 1.css
如果沒有錯誤,就會在你編譯程序的文件夾生成exe可執行文件。假如我們在C#代碼中這樣輸入
using System; class Program { static void Main() { Console.WriteLine("Hello World"); Console.Read(); } }
用css編譯器編譯它,會生成一個exe文件,打開它,會發現出現一個控制台應用程序並輸出了 Hello World,這代表着我們的程序編譯成功了。
這只是讓大家簡單的了解一下csc編譯器。在講用csc編譯WPF程序之前,先得說些csc編譯器基本語法參數:
/targert 生成的文件類型,具體見下:
/target:exe
創建 .exe 文件。
/target:library
創建代碼庫。
/target:module
創建模塊。
/target:winexe
創建 Windows 程序。
/target:winmdobj
若要創建一個中間的.winmdobj 文件。
例如輸入 csc /target:exe 1.cs,就生成了一個exe控制台程序
由於默認選擇是 /target:exe,因此上邊的控制台程序未加任何參數就編譯成功了,若是編譯WPF程序,應該要選擇/target:winexe 。
/reference (/r ) 引用程序集文件
例如輸入 csc /r:System.dll /target:exe 1.cs ,就加載引用了System.dll
目前用到的就是以上兩個,其他的請查閱msdn中的內容或者百度,現在開始構造我們的WPF程序。
眾所周知,WPF有幾個基本程序集,分別是PresentationCore.dll,PresentationFramework.dll和WindowsBase.dll,另外還要引用System.Xaml.dll(后一個與csc編譯器位於同一個文件夾,前三個位於子文件夾WPF下),因此在編譯的時候應當引用它們。
編寫我們的C#代碼:
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Media; using System.Windows.Media.Animation; public partial class App:Application { [STAThread] //表示單一線程單元 public static void Main() //主函數入口 { App app=new App(); //創建一個繼承自Application的App對象 app.Run(); //運行它 } Grid grid; //表示窗口中的Grid Window w; //表示一個Window窗口 protected override void OnStartup(StartupEventArgs e) //App啟動時觸發 { base.OnStartup(e); w=new Window(); //實例化窗口 grid=new Grid(); //實例化Grid w.Title="Hello World Application"; w.Content=grid; //設置Window窗口的內容為一個Grid w.Width=300; w.Height=200; w.Loaded+=MainWindow_Loaded; w.Show(); //顯示窗口 } void MainWindow_Loaded(object sender, RoutedEventArgs e) { TextBlock tb=new TextBlock(); //創建一個TextBlock控件 tb.Text="Hello World"; //設置文本 grid.Children.Add(tb); //將其添加到Grid中 TranslateTransform tt=new TranslateTransform(); //創建一個平移變換對象 tb.RenderTransform=tt;//關聯到TextBlock控件 tb.RenderTransformOrigin=new Point(0.5,0.5); //設置變換點 DoubleAnimation da = new DoubleAnimation(); //創建動畫 da.To = w.ActualWidth - tb.ActualWidth; //設置動畫的To屬性 da.Duration = TimeSpan.FromSeconds(10); //設置動畫的持續時間 da.RepeatBehavior = RepeatBehavior.Forever; //反復執行動畫 Storyboard.SetTarget(da, tb); Storyboard.SetTargetProperty(da,new PropertyPath("RenderTransform.X")); Storyboard story = new Storyboard(); story.Children.Add(da); story.Begin(); //開始動畫 } }
代碼中加入了WPF中標志的動畫,為了避免你不知道它是WPF程序
開始編譯代碼,在命令提示符中輸入:
csc /target:winexe /r “WPF\PresentationCore.dll”, “WPF\PresentationFramework.dll”,”WPF\WindowsBase.dll”,” System.Xaml.dll” 1.cs
運行它,如果代碼沒什么問題,將會編譯生成WPF應用程序。不知道大家有沒有覺得這個編譯命令是不是有點長,有點不利於輸入呢?有沒有簡單的方法,比如將引用的所有程序集名單寫入一個配置文件中?答案是可以的,但不是隨便寫進一個配置文件中就可以。
如果你足夠細心的話,你會發現上邊的控制台程序並沒有引用程序集文件的dll就直接using了,難道編譯器自動尋找並引用了?當然不是,在csc所在的文件夾中,還有一個文件,名為csc.rsp,用記事本打開它,其中有許多的程序集引用,包含了大部分常用的程序集,但是並沒有WPF相關的程序集,所以我們將WPF的幾個核心程序集(PresentationCore.dll,PresentationFramework.dll,WindowsBase.dll)添加到csc.rsp文件中,具體怎么添加,相信各位打開csc.rsp就知道了,路徑和命令提示符中輸入的路徑一樣。(值得注意的是,Windows Vista以上的操作系統可能存在管理員權限問題,需要把此文件復制到別處編輯好再覆蓋原來的文件即可,若還不行,則添加你所使用用戶的修改權限)
具體添加到csc.rsp的內容:
/r:"WPF\PresentationCore.dll"
/r:"WPF\PresentationFramework.dll"
/r:"WPF\WindowsBase.dll"
/r:"System.Xaml.dll"
配置完成以后,可就是一勞永逸,因此在命令提示符中直接輸入
csc /target:winexe 1.cs
點回車,我們的WPF程序就編譯完成了,運行一下,看看是否成功了呢?
這篇文章花了我很多的時間,希望對大家有所幫助,如果覺得寫得不好,請在評論中提出來,我將撤出首頁,謝謝合作!!!!