出版時(shí)間:2009-5 出版社:人民郵電出版社 作者:黃際洲,崔曉源 頁(yè)數(shù):419
Tag標(biāo)簽:無(wú)
前言
自從2000年微軟公司.NET平臺(tái)問(wèn)世以來(lái),全球已經(jīng)有超過(guò)400萬(wàn)開(kāi)發(fā)人員使用.NET平臺(tái)進(jìn)行軟件開(kāi)發(fā)。對(duì)于.NET來(lái)說(shuō),這無(wú)疑是一個(gè)巨大的成功。這不僅僅體現(xiàn)在商業(yè)上的成功,其核心價(jià)值在于.NET為基于微軟Windows平臺(tái)的軟件開(kāi)發(fā)過(guò)程提供了一種新穎、高效的編程模型。在該模型下,開(kāi)發(fā)人員能夠更容易地將精力集中在其特定的開(kāi)發(fā)情景中,而不用過(guò)多地關(guān)注消息循環(huán)、窗口過(guò)程等操作系統(tǒng)底層的處理。目前,基于-NET平臺(tái)的技術(shù)和開(kāi)發(fā)環(huán)境正處于飛速發(fā)展的時(shí)期。在本書(shū)即將出版之際,微軟公司已經(jīng)正式發(fā)布了NET Framework 4.O所支持的新特性以及預(yù)覽版。另一方面,由于歷史的原因,在.NET出現(xiàn)之前,開(kāi)發(fā)人員已經(jīng)編寫(xiě)了大量經(jīng)過(guò)嚴(yán)格測(cè)試且可復(fù)用的非托管代碼。它們以C庫(kù)函數(shù)、C++類庫(kù)以及COM組件的形式存在于諸多應(yīng)用程序和框架之中,并承擔(dān)著非常重要的角色。但由于在托管和非托管對(duì)象模型之間,數(shù)據(jù)類型、方法簽名和錯(cuò)誤處理機(jī)制都存在很大差異,從而使兩種編程模型之間的代碼互用和移植更加復(fù)雜。因此,在很長(zhǎng)一段時(shí)期內(nèi),開(kāi)發(fā)人員必須面對(duì).NET與久經(jīng)考驗(yàn)的“遺留代碼(1egacy code)”長(zhǎng)期并存的局面。當(dāng)然,開(kāi)發(fā)人員可以選擇.NET平臺(tái),使用托管代碼重寫(xiě)這些已有的非托管代碼。但這個(gè)重寫(xiě)的過(guò)程勢(shì)必會(huì)枯燥無(wú)味,而且項(xiàng)目經(jīng)理也不會(huì)在項(xiàng)目進(jìn)度中安排大量的時(shí)間以進(jìn)行重寫(xiě)代碼的工作。更讓開(kāi)發(fā)人員感到尷尬的是,很多時(shí)候,即使花了很大代價(jià)對(duì)非托管代碼進(jìn)行了重寫(xiě),但還是不能保證重寫(xiě)后的托管代碼像那些久經(jīng)考驗(yàn)的非托管代碼一樣正常或高效地工作。因此在很多情況下,重用已有非托管代碼就成了最經(jīng)濟(jì)、可行的解決方案。以下是這些情況中的一些典型案例。開(kāi)發(fā)人員所在的部門(mén)一直使用第三方提供的COM組件為產(chǎn)品的核心功能提供支持。而新業(yè)務(wù)要求使用.NET平臺(tái)。這就出現(xiàn)了一個(gè)問(wèn)題。一方面公司已經(jīng)為這些COM組件投入了大量的資金,不會(huì)輕易放棄這些組件。另一方面開(kāi)發(fā)部門(mén)使用.NET平臺(tái)進(jìn)行開(kāi)發(fā),無(wú)法直接使用這些COM組件。因此,有效地在.NET平臺(tái)中重用這些COM組件就成為產(chǎn)品成功的關(guān)鍵要素。
內(nèi)容概要
本書(shū)介紹Windows平臺(tái)上的托管代碼與非托管代碼之間進(jìn)行互操作的各種技術(shù),包括由.NET提供的各種互操作方法、屬性以及各種工具的用法及其工作原理。本書(shū)包括3部分,平臺(tái)調(diào)用——主要用于解決在托管代碼中調(diào)用非托管程序設(shè)計(jì)語(yǔ)言編寫(xiě)的flat API(如Win32 API、C/C++風(fēng)格的API等)的問(wèn)題;C++ Interop——技術(shù)專門(mén)用于解決托管代碼與C++編寫(xiě)的非托管代碼之間的互操作問(wèn)題;COM Interop——介紹了使用COM Interop解決在托管代碼中調(diào)用COM組件,以及在COM中調(diào)用托管類型的問(wèn)題?! ”緯?shū)適合所有在開(kāi)發(fā)過(guò)程中需要涉及到托管代碼與非托管代碼進(jìn)行交互操作的.NET開(kāi)發(fā)人員閱讀使用。不論是開(kāi)始學(xué)習(xí).NET編程的開(kāi)發(fā)人員,還是剛剛接觸互操作的資深.NET開(kāi)發(fā)人員,都能從本書(shū)中獲益。
作者簡(jiǎn)介
黃際洲,2004-2007年連續(xù)四年微軟最有價(jià)值專家(MVP)。感興趣的研究方向主要包括自然語(yǔ)言處理、信息檢索、聊天機(jī)器人等。他曾翻譯了三本游戲編程方面的書(shū)籍:《Direct 3D中的2D編程》、《游戲編程All in One》及《Directx角色扮演游戲編程》。
書(shū)籍目錄
第一部分 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)用中的異?;蝈e(cuò)誤 1.8.1 非托管函數(shù)的托管定義導(dǎo)致的異?;蝈e(cuò)誤 1.8.2 非托管函數(shù)導(dǎo)致的異常或錯(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)用的原理和過(guò)程 1.10.2 通過(guò)手動(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 光盤(pán)內(nèi)容介紹 附錄B 有關(guān)互操作技術(shù)的互聯(lián)網(wǎng)資源 附錄C 本書(shū)所用術(shù)語(yǔ)表
章節(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)用過(guò)程中耗費(fèi)在數(shù)據(jù)封送處理上的時(shí)間,從而能極大地提升平臺(tái)調(diào)用的性能。(3)盡可能避免從LJnieode到ANSI的轉(zhuǎn)換。由于.NET采用的是unicode編碼,如果要調(diào)用的非托管函數(shù)接收的是ANSI字符(串),那么封送拆收器必須先將字符(串)從LJnieode轉(zhuǎn)換為ANSI,再?gòu)耐泄軆?nèi)存中將字符(串)復(fù)制到非托管內(nèi)存中。這樣不僅編碼轉(zhuǎn)換會(huì)犧牲性能,而且復(fù)制操作也會(huì)耗費(fèi)時(shí)間。除了上面介紹的這3種經(jīng)過(guò)對(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開(kāi)發(fā)平臺(tái)上不得不面對(duì)的任務(wù)。《精通.NET互操作:P/Invoke,C++Interop和COM Interop》這本書(shū)深入而透徹地解析了.NET支持的三種與原生代碼互操作的技術(shù),作者以自己的經(jīng)驗(yàn)講述了原生代碼與托管代碼之間互操作所涉及到的編程要點(diǎn),以及背后的一些實(shí)現(xiàn)原理。書(shū)中提供的實(shí)例有助于程序員快速領(lǐng)會(huì)并掌握.NET與原生代碼互操作技術(shù)的用法。我建議在.NFT平臺(tái)上工作的程序員讀一讀這本書(shū)。 ——潘愛(ài)民,著名技術(shù)作家,著有《COM原理與應(yīng)用》等多部暢銷書(shū),并翻譯了多部經(jīng)典名作
編輯推薦
《精通.NET互操作P/Invoke,C++Interop和COM Interop》涵蓋了:使用P/Invoke調(diào)用C庫(kù)函數(shù)及windows API;使用C++Interop與C++類庫(kù)及核心算法庫(kù)進(jìn)行交互;使用COM Interop實(shí)現(xiàn)托管代碼與COM之間的交互。
圖書(shū)封面
圖書(shū)標(biāo)簽Tags
無(wú)
評(píng)論、評(píng)分、閱讀與下載
250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版