2012年10月11日 星期四

.NET 動態程式碼的產生與編譯(一)-簡述



        由於工作上的需要,必須讓產品程式在RunTime階段,「可隨機載入可外部修改的部份編碼程式」;例如某產品的輸出結果,依需求在RunTime會有不同的邏輯運算組合方式—複雜點甚至不同的演算法邏輯的搭配組合,並且不希望為了部份程式碼的修改重新編譯整個程式。所以,針對此需求大概可分成幾個部份的問題概念:
1.          如何動態編碼與組譯?
2.          若要動態編譯的程式碼只是部份碼(會利用到DesignTime階段已建立的方法與成員),那要如何解決呢?
3.          動態程式碼編譯完成後,如何載入到主程式中?

綜合以上需求,其實就是在使用CodeDOM這個Namespace,其主要用來表示程式碼中的項目和結構的相關類別。

以下擷取自MSDN
The .NET Framework includes a mechanism called the Code Document Object Model (CodeDOM) that enables developers of programs that emit source code to generate source code in multiple programming languages at run time, based on a single model that represents the code to render.
To represent source code, CodeDOM elements are linked to each other to form a data structure known as a CodeDOM graph, which models the structure of some source code.
The System.CodeDom namespace defines types that can represent the logical structure of source code, independent of a specific programming language. The System.CodeDom.Compiler namespace defines types for generating source code from CodeDOM graphs and managing the compilation of source code in supported languages. Compiler vendors or developers can extend the set of supported languages.
Language-independent source code modeling can be valuable when a program needs to generate source code for a program model in multiple languages or for an uncertain target language. For example, some designers use the CodeDOM as a language abstraction interface to produce source code in the correct programming language, if CodeDOM support for the language is available.
The .NET Framework includes code generators and code compilers for C#, JScript, and Visual Basic.
         
從MSN的敘述中我們可以看出,CodeDOM提供了我們外部源碼在RunTime階段的生成與編譯功能,而其強大的CodeDom名稱空間包含了許多以語言中立的形式描述常見程式結構的物件,其中每一種語言的細節則由與該種語言對應的 CodeProvider物件負責處理。簡單講其包括了兩個主要部份:
1.          System.CodeDom讓程式自行產生一個通用程式語言的虛擬架構,例如CodeCompileUnit是用來為CodeDom程式容器提供容器,CodeEntryPointMethod則提供程式的進入點(eg. Main(){….})
2.          System.CodeDom.Complier則提供生成實際文檔,並提供編譯相關的功能,例如CodeDomProvider提供基底類別 (Base Class) 以轉換成其他語言(eg. C#的Microsoft.CSharp.CSharpCodeProvider)。

所以CodeDom基本上就可以解決源碼動態生成與編譯的問題;那要「動態程式碼編譯完成後,如何載入到主程式中?」的問題呢?這裡我們會用到.NET另外一個特別的技巧「反映 (Reflection)」,在下列狀況中,十分有利於Reflection的使用(節錄自MSDN):
·         當您需要存取程式中繼資料的屬性。請參閱使用反映存取屬性主題。
·         檢查與執行個體化組件中的型別。
·         在執行階段建置新型別。請使用 System.Reflection.Emit 中的類別。
·         執行晚期繫結,存取在執行階段所建立型別的方法。請參閱主題動態載入和使用型別。

Reflection的概念很繁雜,在這裡其實主要只有MethodInfo的調用而已,等之後用到的時候再來細談。

2011年8月6日 星期六

握緊妳的手

甚麼樣的畫面會讓人映像深刻呢?

還記得半個月前的晚上ㄧ通電話.....「大嫂生了~」
家裡第三個小成員在等了十個月多終於誕生了~
所以,隔天一下班就跟著家裡兩個老的一起騎摩托車去醫院探望辛苦的大嫂
在醫院對面的小公園隨便尋個車位停好位置後,家裡兩位老的早就停好車準備過馬路了。遠遠便看到老爸對著老媽念著
「跨掐啦~(台語:看車啦~)」老爸抓住急急忙忙就想過馬路的老媽
「打蓋過漏攏某勒諸易(台語:每次過馬路都沒在注意).....」老爸嘴裡一邊念著不停,另ㄧ邊伸出手緊緊握住老媽的滿是老人斑的手
只看見老媽也習慣了老爸此時的嘮叨一般,只是微微笑著被老爸緊抓著手,小心走過短短的路口.....。



牽著妳的手,不是因為愛情

握緊妳的手,不是因為誓言

他緊緊拉​住的~是35年來累積的依賴......


老爸,祝你父親節快樂

2011年8月3日 星期三

鴨子聽雷

台灣俚語(歇後語)---- 鴨子聽雷 
意思:形容聽不懂,有聽沒有懂,聽了也不動(懂)叫做「鴨子聽雷」(請幻想打雷時一群鴨子嘴巴張開開彷彿被嚇到一般,傻傻呆望著打雷方向的樣子)。
用這句話來形容我一開始自學英語的處境再適和不過了.....一個愣著兩個眼睛、嘴巴張開開、聽著英語朗誦的人,在聽完後只能發泄的說了ㄧ聲「按~是在念啥聽隆謀啦~」

-------------以下是廢話--------------
    這陣剛好是轉職的空擋期,正想趁這段時間好好檢討自己的競爭力時,才發現英語有多麼的差,天那~全民英撿評估只有國中程度.......(真是太打擊人嚕~)
不過想想,技職體系出生的我,英文差好像也是理所當然的事......好啦!我是在找藉口啦!所謂君子報仇三年不晚,所以我想~學英語應該也是年過三十不晚(自我催眠中);因此,我開始找尋相關的英語學習管道,包括補習班、自學教材等等,不過自己程度太差,又不想花太多錢在補習,所以我先以教材自學的方式開始

    「空中英語教室」

    沒錯,對這雜誌有研究的應該覺得奇怪,空中英語教室是屬於中、高級程度的,怎麼作者國中程度的英語卻跳級學習哩?沒辦法,誰叫本人年紀ㄧ大把了~好面子,就是不敢拿著初級程度的大家說英語去跟美麗的櫃台妹妹結賬哩~
    既然頭都洗了,就給他溼到底~給他好好學習嚕~以下分享ㄧ些心得給沒看過這本雜誌又想嘗試英語自修的人

------------以下才是心得-----------
    就如同前面講的,「空中英語教室」是一本屬於中、高階的英語雜誌,「大家說英語」屬於基礎,若自認英語不錯可以直接讀「彭蒙惠英語」(Advanced),每個月一本的方式販售,版本上也有分:純雜誌、雜誌+CD、雜誌+super光碟,當然越後面的越貴~我是買光碟+super光碟的版本,光碟內容就自己去官網看吧 http://studioclassroom.com/
   雖然課文通常只有十幾則主要題目,但是內容會自動幫你分成30個段落(剛好一個月每天一則),每個段落搭配一則課文講解(約半小時),所以通常每天花1~2小時自習就可以完成,下面是本人自修的方式:
  1. 先自行閱讀課文,把生字標示出 ,光碟有提供生字庫建立程式,不過我是自己寫在自己的筆記本上方便復習。
  2. ㄧ邊聽課文朗誦,ㄧ邊閱讀,這邊重點在閱讀能力跟聽力速度都要能趕上朗讀的速度。
  3. 只聽課文朗誦,並試著聽出語意,單純加強聽力而已,不過也會強制生字的記憶(沒背好應該也聽不懂)。
  4. 聽課文講解,在講解時會大量重複課文內容,而且會有不同情境與講解方式,所以可以聽到不同口音的朗誦,對英語聽力的適應性滿有幫助的 。
  5. 復習生字,一開始能力很差,很多生字要復習,應該未來越來越好。

    我通常晚上會花1、2小時做完上面,然後隔天早上再看時間是否充裕選擇重聽課文朗誦或課文講解,不過,真的能力太差了,我都花了兩到三天的時間,確定相關內容都會了才往下個課文學習,所以兩個禮拜過後才看完6段課文,大概要等幾個月後才能真的達到一天看完一則課文的能力吧,不過建議真的要多聽,聽久了有助於對英語語句的解析能力,就算聽不懂也才能發現是哪個單字聽不懂。

===========
    文章內容為學習的感與紀錄,主要是當作鞭策自己的手段,若有不小心進來的英語高手,麻煩笑笑以後給點指教,本人會感激不盡的