[.NET] 關於晚期繫結 (Late Binding)

晚期繫結是一種程式語言與作業系統的手法,用意在於避免因為編譯時期的型別檢查機制,導致程式員在編寫程式時,需要處理過多的型別資訊 (Type Information),晚期繫結可以有效的處理在平台之間型別資訊的隔離,讓編譯出來的程式可以在特定的平台之間執行,而不需要被型別資訊綁住,不過也不能過度濫用,除非原生平台就是要用晚期繫結 (例如 JavaScript)。

...繼續閱讀 »

[.NET] Connect(); 的多項宣布:Visual Studio 2015, Visual Studio Community Edition, .NET Open Source, .NET Core Framework, ASP.NET 5

Connect() 研討會在昨晚於 Channel 9 線上開幕,發表了數個 .NET 的未來走向,以及新工具的發表,其中最令人期待的當然就是 Visual Studio 2015,這個代號 VS 14 的新版開發工具,它除了持續性的功能演化外,另一個我們一直在關注的新平台:ASP.NET vNext,正式定名為 ASP.NET 5,這可不是 MVC 5,而是整個平台的版本,而 .NET Framework 本身也分為兩支,一支是原本的 .NET Framework,持續演化並維持與舊版本的相容性,版本號碼為 4.6;另一支則是全新的 .NET Framework,稱為 .NET "Core",這個版本是輕量化的 .NET Framework,所有組件都重新設計,擺脫與 .NET Framework 大多數核心組件的相依性,以作為 Cloud 平台的核心執行引擎,同時它也搭配了 .NET Native 等新一代的執行環境一起釋出,它也是首個正式進軍 Linux 與 Mac 的官方 .NET 平台。

...繼續閱讀 »

[.NET][vNext] .NET vNext @ 2014

.NET Framework 才剛宣佈 4.5.2 沒多久,隨即在 TechEd 2014 North America 上宣布 .NET Framework 的 vNext 版本,它也是 ASP.NET vNext 的核心,這次的 .NET vNext 倒不會看到在 BCL (Base Class Library) 上有多少改變,倒是為了配合微軟的新策略,大量引進 Open Source 的概念,將原本專屬於微軟的相關技術都開放,並且針對 Device 和 Cloud 的應用情境做專屬的最佳化,讓 .NET 在 Device 和 Cloud 都能獲得最佳表現,同時也讓 .NET 可以跨出 Windows 平台 (之前只有 Mono,微軟希望有更多的平台加入...

...繼續閱讀 »

[.NET][LINQ] Any() vs. Count() 何時可用? 何時不可用?

LINQ 語法中有兩個很令人玩味的方法,一個是 Any(),另一個則是 Count(),Any() 的功能是判斷集合中是否有物件,Count() 則是用來計算集合中的物件數量,功能其實很像,以一般的使用習慣來說,我們多半會使用 Count() 來判斷集合中是否有物件,而且在大多數的情況下是沒問題的。

...繼續閱讀 »

[.NET] NuGet 技巧之偷天換日

NuGet 真的是所有寫元件的程式設計師應該要好好玩一下的東西,不僅僅是它方便開發人員引用你辛苦開發出來的元件,它也隱藏了一些讓元件開發者能即時修改專案內的資訊,例如組態檔 (configuration file)。

...繼續閱讀 »

[.NET] 製作你的 NuGet 元件

自從 NuGet 2.0 讓加入元件到 Visual Studio 專案變得超級簡單之後,很多來自微軟和第三方廠商的免費套件也都大量使用 NuGet 來作為 SDK 或可程式的元件的集中地,NuGet 也有提供 Server 版本讓企業內的開發團隊也能建置 NuGet 類型的服務,加速開發人員在整合參考元件的處理速度。

...繼續閱讀 »

[Data Access] ORM 原理 (10) : 全程式碼對映–當 ORM 遇到 Lambda 與 Fluent Interface

ORM 原理前面8集中己經講述了基本的ORM核心內的運作方式,大多數的ORM其實都是這麼做,當然還會做一些更進一步的最佳化工作,例如產生SQL的方式等。不過既然都是寫程式的,當然會希望這些對應欄位的設定工作可以完全的程式化 (Coded Map),而不用再假手那麼多的設定檔。

...繼續閱讀 »

[Windows Azure] 使用 Windows Azure Access Control Service 2.0 開發 ASP.NET MVC 單一簽入應用程式

單一簽入 (Single Sign On) 一直是驗證存取權機制的最終境界,整合單一簽入的技術在市場上早已炒到不能再炒了,而且也有相當多的單一簽入解決方案,其中包含 OAuth 1.0/2.0,Open ID,Active Directory,LDAP 等等協定和服務,而在社群網路流行後,幾個重要的大型帳戶儲存庫像 Facebook, Google, Yahoo, Twitter, Plurk, Linked In 等廠商也相繼的開發了認證的 API 群,以支援來自不同設備或用戶端的驗證需求,而在台灣最新的個人資料保護法正式施行前,外部的單一簽入已經成為應用程式認證機制的首選,尤其是小型網站或新進市場的應用程式,透過大廠來處理驗證,使用者不但不用記太多的帳戶密碼,也容易吸引使用者登錄資料...

...繼續閱讀 »

[Windows Azure] Spring Release 新功能五部曲:全新的快取模式

Session State 和雲端應用程式狀態管理一向是設計 Cloud 應用程式的重要考量因素之一,因為雲端應用是分散在不同的虛擬機器內執行的,VM 間可應用的大概只有像資料庫或 storage 這種集中式資料來源,而且雲端應用的儲存也都是分散式的,若是有一個地方能快取這些資訊,那麼就能降低分散環境的 I/O 負擔,應用程式的回應速度也會比較快,所以才會有 Windows Azure Caching Services (原稱 AppFabric Caching Services) 的出現,只是有個問題,就是它有點貴:128MB 的快取要 $45 美元月費,而中大型應用程式的快取通常需求又很高,同時 Caching Services 也是分散式的環境,所以還是有 I/O 的問題。

...繼續閱讀 »

[.NET][Office] 使用 Word 2010 在 Server 端將 DOC/DOCX 轉換成 PDF

這個需求真的是老需求了,只有使用者端有 Office,就難免會有這種需求,像是在 server 上產生 Word, Excel 或是將表格轉換成 Word/Excel 格式下載的,而這次碰到的需求是要將 Word 轉換成 PDF,只是目前市場上可用的免費工具如 itextsharp, pdfFactory 這種,都不能支援由 server 轉換文件為 PDF,而一些可轉換的元件要錢而且很貴 ($599 鎂以上,可轉散布的更貴),在一個預算有限的專案上,僅能使用最原始的方式來實作這個功能,畢竟 $399 還是比 $599 便宜多了...

...繼續閱讀 »

[Data Access] ORM 原理 (9) : 資料的新增,修改與刪除

到原理 (8) 為止,我們已經完成了資料的查詢工作,但資料庫應用程式不是只有查資料而已,對資料的新增,修改和刪除 (C/R/U/D) 也要實作,才算是具有完整的資料存取能力,所以我們也必須要做到 C/U/D 才行,對程式來說,C/U/D 比 R 要簡單,但還是會有一些需要考量的地方,首先,在一堆資料的集合物件中,大部份的情況下不是每一筆都需要做 C/U/D,怎麼判斷每一個物件的狀態,以及在處理物件時何時更改狀態,就是一個重要的課題了,再者,如何產生資料庫需要的 INSERT/UPDATE 和 DELETE 指令,也是我們需要關心的。

...繼續閱讀 »

[Data Access] ORM 原理 (8) : 集合處理與 Lazy Loading

在原理 (7) 中,我們完成了關聯的基本處理,只是我們做到的是一對一的關聯,如果今天要的是一對多的關聯時,我們就需要處理到集合物件,集合物件不像單一物件那麼簡單,尤其是集合物件的元素又和其他物件有關聯時,載入的方式就會決定程式的速度,以我們到目前為止的例子,Customers, Orders 和 Employees 三個表格,Customers 會和 Orders 有一對多的關係,而 Orders 和 Customers 與 Employees 有一對一的關係,我們在原理 (7) 中實作的是 Order 類別,所以是一對一,但如果我們要實作 Customers 和 Orders 之間的關係,會變成一對多,也就是我們要處理 Customer 類別內的 OrderCollection 集合物件...

...繼續閱讀 »

[Data Access] ORM 原理 (1) : 物件和資料是怎麼繫結 (binding) 的?

我想大家或多或少都聽過 Entity Framework 或是 NHibernate Framework 這種大型應用程式開發的 Framework 吧,它們都是做 ORM (Object Relational Mapping) 技術的資料存取函式庫,只是很多人都只看它有什麼功能,卻沒有多少人對它內部感興趣-為什麼它們可以精確的對應 SQL 的欄位和物件屬性呢?我試著以一系列的文章來介紹 ORM 到底做了什麼事。

...繼續閱讀 »

[OAuth Series] EasyOAuth Framework 2.0 Desktop and Web Edition

繼今年四月份的 EasyOAuth Framework 1.0 上架到 Codeplex.com 後,除了再檢視程式本身以外,還吸取一些來自社群的意見 (雖然不多...),以及配合 Windows Live ID 支援 OAuth 2.0 規格的發表,EasyOAuth Framework 也順勢改版到 2.0,同樣支援 Desktop Edition 與 Web Edition,可供桌面應用程式與 Web 應用程式的 OAuth 認證機制開發功能。

...繼續閱讀 »

[Software Development] 關於序列化 (Serialization) 這件事

要是寫程式,一定多多少少會需要讀寫資料,畢竟 Program = Data Structure + Algorithm,只是大多數的情況下,資料的讀寫多半是對資料庫,而資料庫內的檔案實際讀寫由 DBMS 自己控制,開發人員基本上是碰不到的,但是資料不是只會存在資料庫內,像是檔案系統 (File System),網路資料或是其他可能的資料儲存地,而像這些不同的資料保存,都需要由開發人員自己處理 I/O 的工作...

...繼續閱讀 »

[Architecture] 孰輕孰重?Web Service vs. REST APIs

Web Service,這個從 2001 年開始被微軟炒起來的分散式元件概念,隨著 Visual Studio 2002 (.NET Framework 1.0) 的推出得到了軟體龍頭微軟的背書,一個原本要從 SOAP 和 XML 開始打造的可重覆使用 (reusable) 式軟體元件就在 .NET Framework (System.Web.Services 命名空間) 的精美包裝下,讓開發人員只需要使用 [WebMethod] 就能夠寫出自己的 Web Service 元件...

...繼續閱讀 »

[.NET] PropertyGrid 控制項的進階使用:自訂資料檢視與編輯器

最近這一個月事情還真不少,不斷的在嘴砲和務實的角色之間切換,也寫了不少的程式碼,而且為了因應今年 9/13-15 的微軟大拜拜 (Tech.days) 的課程,我還特別寫了支範例程式準備要在課堂上 demo 用,這支範例程式是 Windows Azure Platform 上的服務管理應用程式,核心均來自 Service Management APIs,很快的,就在 Tech.days 2011 Taiwan 研討會中將正式釋出...

...繼續閱讀 »

[Security] 判別式存取控制表 (Discretionary Access Control List) 實作:階段 2,誰能存取,我決定。

我們在階段 1 中已經完成了最基本的 DACL 資料結構,能針對簡單的 CRUD 權限做控制,但一般來說權限設定沒那麼簡單 (尤其是複雜度高又講求安全的系統),很多程式或系統有時無法只單純用 CRUD 就可以解決...

...繼續閱讀 »

[Security] 判別式存取控制表 (Discretionary Access Control List) 實作:原型概念

判別式存取控制表 Discretionary Access Control List (DACL),這個自由度頗高的存取控制方法,在 Windows 以及其他作業系統中已行之有年,它最大的特色就是使用者和群組可以擁有自己的存取控制設定,而系統物件也可以擁有自己的存取控制項目,也就是說系統物件不會只有 CRUD 四種權限,還可以因為物件的特性而定義額外的權限,例如存取詮釋資料 (metadata), 列印 (printing) 或是下載檔案 (download) 等權限,discretionary 這個字有 "任意的","無條件的" 的意思,而 DACL 也是讓消費者和生產者可以擁有自己的權限設定,只需要在存取時進行檢查即可。

...繼續閱讀 »

[.NET] 有關強式名稱 (Strong Name) 的兩三事

Strong Name 是 .NET Framework 中很特殊的一個特性,大多數的 .NET 開發人員不會使用到這樣東西,不過如果是從事 Framework 或是可轉散布型的軟體的開發人員,就需要知道這東西,因為它是一種組件識別 (asembly Identify) 機制,透過 Storng Name,它可以讓使用該組件的開發人員能確定這個組件是來自於建置的廠商或開發人員,而不是從中被竄改過。

...繼續閱讀 »

[IADP Series] 自己寫 SDK 互動的程式太麻煩了,更 Smart 的 SDK 互動作法

在 Intel AppUp SDK Developer's Guide 中,有不少的篇幅都是在講應用程式和 SDK 一些函式的整合,以將 AppUp Center 的機能和應用程式整合在一起,像是 Application Registration, Instrumentation (Events), Upgrade 與 Crash Report 等,除了之前我所發表的使用 Exception 決定 Crash Report 的功能外,我們還可以進一步的將 SDK 的函式包裝起來,讓在整合 SDK 和應用程式的過程能更簡單,簡單到什麼程度呢 ... 只要使用一個類別即可,而且相關的 Exception 都會轉換成自訂的 Crash Report。

...繼續閱讀 »

[.NET] 使用密碼演算法加解密檔案時,會出現檔案開啟失敗或是大小增加的解法

這是今天碰到的有趣問題。一般我們在使用對稱 (或非對稱) 加密演算法加密資料時,很習慣的就用 CryptoStream,然後用 Write 來加密,用 Read 來解密,而且平常也是用的好好的,一些字串加密的工作其實很容易就做完了。但是如果遇到了檔案型的資料時,很容易會因為檔案大小在加密時發生變化,而導致解密時檔案無法被打開 (ex: Office 2007 的檔案)。如果觀察一下,可以發現原始資料和加密過的資料大小會有不同。

...繼續閱讀 »

[IADP Series] 誰說一定要每個錯誤都要覆寫 Crash Report? 由 Exception 來決定吧。

Crash Report 的原理部份 Alex Lee 大已經有寫一篇文章說明,這裡我就不贅述,不過如果要為每個錯誤都覆寫一次 DefaultCrashReport,那如果應用程式中有上百種錯誤,那豈不是要寫上百個 Crash Report?累死人也 … 那如果可以把 Crash Report 的資料交由 Exception 來決定,開發人員只要簡單的產生自訂的 Exception 的話,那不就變得很簡單?

...繼續閱讀 »

[IADP Series] 開發 IADP-Compliant 應用程式的事前準備

Intel AppUp Developer Program 是一個由 Intel 建置的軟體市集,就像 Apple AppStore 或微軟的 AppHub 一樣,可以讓開發人員自由上傳應用程式,並且由使用者於 AppUp Center 中付費或免費下載使用,而且 AppUp Center 不限於 Mobility 應用程式,它也可以支援 Windows 以及 Web (Flash AIR) 應用程式,而且 Windows 程式還可以支援到 .NET 以及 C++ 環境,更好的是現在 Intel 為了推廣 IADP 計畫,免收 $99 美金的註冊費用,對開發人員來說也算是一種好康吧。

...繼續閱讀 »

[.NET][OAuth Series] EasyOAuth Library for Web Application

自昨天首發 EasyOAuth Library for Desktop Application 後,今天再進一步發表 EasyOAuth Library for Web Application,這個函式庫可以支援 ASP.NET 與 ASP.NET MVC 應用程式開發支援 OAuth 功能的 Web 應用程式,它一樣可以在少量程式開發的情況下讓 Web 應用程式支援 OAuth 的功能,並且與 EasyOAuth Library for Desktop Application 一樣,可支援 Google, Facebook, Yahoo 與 Twitter 四種內建的 OAuth Service Provider。

...繼續閱讀 »

[.NET][OAuth Series] EasyOAuth Library: 容易使用且可擴充的 OAuth Library

這是筆者的第三個 Codeplex 開放原始碼專案,承繼前面四篇 OAuth Series 文章的說明,EasyOAuth Library 建構於 .NET Framework 之上,並且可以很容易的將 OAuth 的功能套用到自己的 .NET 應用程式中,並且開發人員可以依照 EasyOAuth Library 開放的介面,為非內建的 OAuth Service Provider 開發介面,以在 EasyOAuth Library 中直接使用。

...繼續閱讀 »

[OAuth Series] 使用 Access Token 存取 Private APIs

在前一回完成了整個 OAuth 驗證與授權的流程後,程式應該可以成功取得 Access Token 以及 Access Token Secret,只要有這兩個資料,應用程式就可以以 Access Token 所代表的使用者來與 OAuth 服務的 Private API 來互動,大多數 OAuth 服務上的 API 都會需要先取得 Access Token 後才可以使用 (雖然還是有少數可以不用啦),所以這篇文章就來說明怎麼使用 Access Token 來存取 Private APIs。

...繼續閱讀 »

[OAuth Series] OAuth 的各式參數說明

OAuth 使用上最難懂以及測試的,莫過於這些 OAuth 的參數,尤其是在 OWASP 的 Web Security Report 之下,又有 Improper Error Handling 的安全漏洞問題,因此在測試 OAuth 時,最容易吃的苦頭就是只知道 HTTP 400 (Bad Request) 或 HTTP 401 (Unauthorized),有些服務還會提供一些錯誤訊息,但也有一點都不提供的,而且就算有提供,也不一定馬上就可以意識到問題在哪 (ex: Signature Invalid) … 往往都要做很多的實驗才能真正找到問題在哪,我在測試 Twitter 的 OAuth 時就吃了很多的苦頭… Orz。

...繼續閱讀 »

[如何學習寫程式] #9 - 寫程式的人,你不能不會 "資料結構" Part 1

資料結構 (data structure) 是資料的組成方式,資料可以是字串或是二進位資料 (binary data),組成方式則要看不同資料整理的需求,可以是分布在記憶體不同位置,然後用特定方法管理,或是以特別的格式排列組合,以達成有效率管理資料的方式,而一般程式設計人員接觸到最多的是資料結構,因為這會決定你在程式中處理資料的方式,簡單的資料當然可以用很簡單的結構來組織,但是如果在寫程式時不在乎資料結構的話,很容易發生寫出的程式效率低落的問題。

...繼續閱讀 »

[.NET] 產生具有多個值,multipart/form-data 的 HTTP POST 訊息

這個功能是在設計 Facebook Graph API Client Library 時碰到的問題,在 Graph API 中的 Publish_Stream 中有一項上傳相片的功能,這個功能內有一個 message 和 access_token 參數,而原本我們學習的 HTTP 技術本身大多都是沒有混合二進位和字串值的參數,所以當時碰到這個問題時,一時想不到什麼解決方法,後來搜尋到 RFC 2188: Returning Values from Forms: multipart/form-data,這份文件說明了在 HTTP POST 訊息中使用多種格式訊息的作法,它可以用在許多 REST-based API 的系統,它可以混合多種資料格式並一次傳送,當然非文字的資料必須要編碼為二進位字串。

...繼續閱讀 »

[.NET] 使用 HTTP Handler 部署不同作業系統版本的 ActiveX Control

筆者在 ActiveX 控制項開發的封裝部署一文的最後,曾經提到 Windows XP 和 Windows Vista/7 的部署差異,這會讓開發人員需要依照作業系統的不同來撰寫 INF 檔案來自動化安裝,而且還要在網頁中偵測不同的作業系統給予不同的 CAB 檔案,但我們有一些方法來簡化這個部份的處理,讓開發人員可以在不動一行 <object> 宣告下,支援 Windows XP 和 Windows Vista/7 的作業系統環境。其實方法很簡單,只要使用 HTTP Handler 就能做到了。

...繼續閱讀 »