出版時(shí)間:2009-5 出版社:人民郵電出版社 作者:黃際洲,崔曉源 頁數(shù):419
Tag標(biāo)簽:無
前言
自從2000年微軟公司.NET平臺(tái)問世以來,全球已經(jīng)有超過400萬開發(fā)人員使用.NET平臺(tái)進(jìn)行軟件開發(fā)。對(duì)于.NET來說,這無疑是一個(gè)巨大的成功。這不僅僅體現(xiàn)在商業(yè)上的成功,其核心價(jià)值在于.NET為基于微軟Windows平臺(tái)的軟件開發(fā)過程提供了一種新穎、高效的編程模型。在該模型下,開發(fā)人員能夠更容易地將精力集中在其特定的開發(fā)情景中,而不用過多地關(guān)注消息循環(huán)、窗口過程等操作系統(tǒng)底層的處理。目前,基于-NET平臺(tái)的技術(shù)和開發(fā)環(huán)境正處于飛速發(fā)展的時(shí)期。在本書即將出版之際,微軟公司已經(jīng)正式發(fā)布了NET Framework 4.O所支持的新特性以及預(yù)覽版。另一方面,由于歷史的原因,在.NET出現(xiàn)之前,開發(fā)人員已經(jīng)編寫了大量經(jīng)過嚴(yán)格測(cè)試且可復(fù)用的非托管代碼。它們以C庫函數(shù)、C++類庫以及COM組件的形式存在于諸多應(yīng)用程序和框架之中,并承擔(dān)著非常重要的角色。但由于在托管和非托管對(duì)象模型之間,數(shù)據(jù)類型、方法簽名和錯(cuò)誤處理機(jī)制都存在很大差異,從而使兩種編程模型之間的代碼互用和移植更加復(fù)雜。因此,在很長一段時(shí)期內(nèi),開發(fā)人員必須面對(duì).NET與久經(jīng)考驗(yàn)的“遺留代碼(1egacy code)”長期并存的局面。當(dāng)然,開發(fā)人員可以選擇.NET平臺(tái),使用托管代碼重寫這些已有的非托管代碼。但這個(gè)重寫的過程勢(shì)必會(huì)枯燥無味,而且項(xiàng)目經(jīng)理也不會(huì)在項(xiàng)目進(jìn)度中安排大量的時(shí)間以進(jìn)行重寫代碼的工作。更讓開發(fā)人員感到尷尬的是,很多時(shí)候,即使花了很大代價(jià)對(duì)非托管代碼進(jìn)行了重寫,但還是不能保證重寫后的托管代碼像那些久經(jīng)考驗(yàn)的非托管代碼一樣正?;蚋咝У毓ぷ鳌R虼嗽诤芏嗲闆r下,重用已有非托管代碼就成了最經(jīng)濟(jì)、可行的解決方案。以下是這些情況中的一些典型案例。開發(fā)人員所在的部門一直使用第三方提供的COM組件為產(chǎn)品的核心功能提供支持。而新業(yè)務(wù)要求使用.NET平臺(tái)。這就出現(xiàn)了一個(gè)問題。一方面公司已經(jīng)為這些COM組件投入了大量的資金,不會(huì)輕易放棄這些組件。另一方面開發(fā)部門使用.NET平臺(tái)進(jìn)行開發(fā),無法直接使用這些COM組件。因此,有效地在.NET平臺(tái)中重用這些COM組件就成為產(chǎn)品成功的關(guān)鍵要素。
內(nèi)容概要
本書介紹Windows平臺(tái)上的托管代碼與非托管代碼之間進(jìn)行互操作的各種技術(shù),包括由.NET提供的各種互操作方法、屬性以及各種工具的用法及其工作原理。本書包括3部分,平臺(tái)調(diào)用——主要用于解決在托管代碼中調(diào)用非托管程序設(shè)計(jì)語言編寫的flat API(如Win32 API、C/C++風(fēng)格的API等)的問題;C++ Interop——技術(shù)專門用于解決托管代碼與C++編寫的非托管代碼之間的互操作問題;COM Interop——介紹了使用COM Interop解決在托管代碼中調(diào)用COM組件,以及在COM中調(diào)用托管類型的問題?! ”緯m合所有在開發(fā)過程中需要涉及到托管代碼與非托管代碼進(jìn)行交互操作的.NET開發(fā)人員閱讀使用。不論是開始學(xué)習(xí).NET編程的開發(fā)人員,還是剛剛接觸互操作的資深.NET開發(fā)人員,都能從本書中獲益。
作者簡(jiǎn)介
黃際洲,2004-2007年連續(xù)四年微軟最有價(jià)值專家(MVP)。感興趣的研究方向主要包括自然語言處理、信息檢索、聊天機(jī)器人等。他曾翻譯了三本游戲編程方面的書籍:《Direct 3D中的2D編程》、《游戲編程All in One》及《Directx角色扮演游戲編程》。
書籍目錄
第一部分 P/Invoke 第1章 使用C/C++類型的非托管函數(shù) 1.1 平臺(tái)調(diào)用簡(jiǎn)介 1.2 Hello World!示例程序 1.3 獲得要調(diào)用的非托管函數(shù)聲明 1.4 平臺(tái)調(diào)用基礎(chǔ)知識(shí) 1.5 指定調(diào)用約定 1.6 指定入口點(diǎn) 1.7 指定字符集 1.8 處理平臺(tái)調(diào)用中的異常或錯(cuò)誤 1.8.1 非托管函數(shù)的托管定義導(dǎo)致的異?;蝈e(cuò)誤 1.8.2 非托管函數(shù)導(dǎo)致的異?;蝈e(cuò)誤 1.9 釋放非托管內(nèi)存 1.9.1 釋放由malloc方法分配的非托管內(nèi)存 1.9.2 釋放由new運(yùn)算符分配的非托管內(nèi)存 1.10 動(dòng)態(tài)平臺(tái)調(diào)用 1.10.1 平臺(tái)調(diào)用的原理和過程 1.10.2 通過手動(dòng)加載非托管DLL實(shí)現(xiàn)動(dòng)態(tài)平臺(tái)調(diào)用 1.10.3 利用反射實(shí)現(xiàn)動(dòng)態(tài)平臺(tái)調(diào)用 1.10.4 利用GetDelegateForFunctionPointer實(shí)現(xiàn)動(dòng)態(tài)平臺(tái)調(diào)用 1.11 提升平臺(tái)調(diào)用性能的技巧 1.11.1 顯式地指定要調(diào)用的非托管函數(shù)的名稱 1.11.2 對(duì)數(shù)據(jù)封送處理進(jìn)行優(yōu)化 1.11.3 盡量避免字符串編碼轉(zhuǎn)換 第2章 平臺(tái)調(diào)用中的數(shù)據(jù)封送 2.1 字符串的封送 2.1.1 封送作為參數(shù)的字符串 2.1.2 封送作為返回值的字符串 2.1.3 封送BSTR類型的字符串 2.2 封送作為參數(shù)的結(jié)構(gòu)體 2.3 封送從函數(shù)體內(nèi)部返回的結(jié)構(gòu)體 2.3.1 封送作為函數(shù)返回值返回的結(jié)構(gòu)體 2.3.2 作為函數(shù)參數(shù)返回結(jié)構(gòu)體 2.4 封送結(jié)構(gòu)體中的字符串 2.4.1 結(jié)構(gòu)體中的字符指針字段 2.4.2 結(jié)構(gòu)體中的字符數(shù)組字段 2.5 控制結(jié)構(gòu)體字段的封送行為 2.6 控制結(jié)構(gòu)體的內(nèi)存布局 2.6.1 定義結(jié)構(gòu)體的部分字段 2.6.2 聯(lián)合體的封送 2.7 封送嵌套的結(jié)構(gòu)體 2.7.1 指向結(jié)構(gòu)體指針字段的嵌套形式 2.7.2 結(jié)構(gòu)體實(shí)例字段的嵌套形式 2.8 封送類 2.8.1 封送引用類型的簡(jiǎn)單示例 2.8.2 封送blittable引用類型 2.8.3 將引用類型封送為指向指針的指針 2.9 封送數(shù)組 2.9.1 封送簡(jiǎn)單類型數(shù)組 2.9.2 封送字符串?dāng)?shù)組 2.10 實(shí)戰(zhàn)演練 2.10.1 背景介紹 2.10.2 模塊介紹 2.10.3 實(shí)現(xiàn)平臺(tái)調(diào)用 第3章 使用平臺(tái)調(diào)用技術(shù)調(diào)用Win32 API 3.1 確定要調(diào)用的函數(shù) 3.2 處理Win32函數(shù)返回的錯(cuò)誤碼 3.3 處理回調(diào)函數(shù) 3.4 使用Windows定義的常量 3.5 封送Win32數(shù)據(jù)類型 3.5.1 可直接復(fù)制到本機(jī)結(jié)構(gòu)中的數(shù)據(jù)類型 3.5.2 非直接復(fù)制到本機(jī)結(jié)構(gòu)中的數(shù)據(jù)類型 3.6 處理句柄 3.7 傳遞托管對(duì)象 3.8 使用P/Invoke調(diào)用Win32 API的最佳實(shí)踐 3.8.1 編碼規(guī)范 3.8.2 性能 3.8.3 安全性 3.8.4 盡量使用Win32函數(shù)對(duì)應(yīng)的.NET托管實(shí)現(xiàn) 第二部分 C++ Interop 第4章 C++ Interop 第三部分 COM Interop 第5章 在.NET中使用COM組件 第6章 在COM中使用.NET程序集 附錄A 光盤內(nèi)容介紹 附錄B 有關(guān)互操作技術(shù)的互聯(lián)網(wǎng)資源 附錄C 本書所用術(shù)語表
章節(jié)摘錄
插圖:本節(jié)主要講述了3種優(yōu)化平臺(tái)調(diào)用性能的方法。(1)將。Dlllmport屬性的ExactSpelling字段設(shè)置為true,顯式地指定要調(diào)用的非托管函數(shù)的名稱,以優(yōu)化平臺(tái)調(diào)用在非托管DLL中搜索函數(shù)的方式。(2)盡可能地使用blittable類型。由于采用blittable類型能夠減少平臺(tái)調(diào)用過程中耗費(fèi)在數(shù)據(jù)封送處理上的時(shí)間,從而能極大地提升平臺(tái)調(diào)用的性能。(3)盡可能避免從LJnieode到ANSI的轉(zhuǎn)換。由于.NET采用的是unicode編碼,如果要調(diào)用的非托管函數(shù)接收的是ANSI字符(串),那么封送拆收器必須先將字符(串)從LJnieode轉(zhuǎn)換為ANSI,再從托管內(nèi)存中將字符(串)復(fù)制到非托管內(nèi)存中。這樣不僅編碼轉(zhuǎn)換會(huì)犧牲性能,而且復(fù)制操作也會(huì)耗費(fèi)時(shí)間。除了上面介紹的這3種經(jīng)過對(duì)比測(cè)試一一驗(yàn)證了的、優(yōu)化平臺(tái)調(diào)用性能的方法外,還有其他一些可以優(yōu)化平臺(tái)調(diào)用性能的方法。比如采用IntPtr作為復(fù)雜類型的封送數(shù)據(jù)類型,或盡可能減少平臺(tái)調(diào)用次數(shù),在非托管代碼中盡可能多地完成操作,而只進(jìn)行獲取最終計(jì)算結(jié)果的平臺(tái)調(diào)用等,這些方法都能夠提升平臺(tái)調(diào)用的性能。在實(shí)際進(jìn)行平臺(tái)調(diào)用時(shí),需要對(duì)造成性能損耗的原因進(jìn)行深入分析,只有弄清了造成損耗的原因,才能更有針對(duì)性地進(jìn)行性能優(yōu)化。
媒體關(guān)注與評(píng)論
托管代碼與非托管代碼之間的交互是許多程序員在.NET開發(fā)平臺(tái)上不得不面對(duì)的任務(wù)?!毒?NET互操作:P/Invoke,C++Interop和COM Interop》這本書深入而透徹地解析了.NET支持的三種與原生代碼互操作的技術(shù),作者以自己的經(jīng)驗(yàn)講述了原生代碼與托管代碼之間互操作所涉及到的編程要點(diǎn),以及背后的一些實(shí)現(xiàn)原理。書中提供的實(shí)例有助于程序員快速領(lǐng)會(huì)并掌握.NET與原生代碼互操作技術(shù)的用法。我建議在.NFT平臺(tái)上工作的程序員讀一讀這本書。 ——潘愛民,著名技術(shù)作家,著有《COM原理與應(yīng)用》等多部暢銷書,并翻譯了多部經(jīng)典名作
編輯推薦
《精通.NET互操作P/Invoke,C++Interop和COM Interop》涵蓋了:使用P/Invoke調(diào)用C庫函數(shù)及windows API;使用C++Interop與C++類庫及核心算法庫進(jìn)行交互;使用COM Interop實(shí)現(xiàn)托管代碼與COM之間的交互。
圖書封面
圖書標(biāo)簽Tags
無
評(píng)論、評(píng)分、閱讀與下載