整合營銷服務(wù)商

          電腦端+手機端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          電腦基礎(chǔ)知識教程-弈安教你認識ActiveX技術(shù)

          文結(jié)合目前Internet(WEB)技術(shù)發(fā)展動向,簡略介紹了Microsoft提出的ActiveX技術(shù)的內(nèi)容,闡述了ActiveX技術(shù)與WEB 站點建設(shè)和桌面程序開發(fā)的關(guān)系,以及利用Visual C++和Visual Basic開發(fā)ActiveX部件的步驟和方法,并給出了在WEB網(wǎng)頁中使用ActiveX部件的例子。

          1. ActiveX概要

          1.1. ActiveX的定義

          ActiveX是Microsoft提出的一組使用COM(Component Object Model,部件對象模型)使得軟件部件在網(wǎng)絡(luò)環(huán)境中進行交互的技術(shù)集。它與具體的編程語言無關(guān)。作為針對Internet應(yīng)用開發(fā)的技術(shù),ActiveX被廣泛應(yīng)用于WEB服務(wù)器以及客戶端的各個方面。同時,ActiveX技術(shù)也被用于方便地創(chuàng)建普通的桌面應(yīng)用程序。

          1.2. ActiveX的內(nèi)容

          ActiveX既包含服務(wù)器端技術(shù),也包含客戶端技術(shù)。其主要內(nèi)容是:

          ActiveX控制(ActiveX Control);用于向WEB頁面、Microsoft Word等支持ActiveX的容器(Container)中插入COM對象。

          ActiveX文檔(ActiveX Document);用于在WEB Browser或者其它支持ActiveX的容器中瀏覽復(fù)合文檔(非HTML文檔),例如Microsoft Word文檔,Microsoft Excel文檔或者用戶自定義的文檔等。

          ActiveX腳本描述(ActiveX Scripting);用于從客戶端或者服務(wù)器端操縱ActiveX控制和Java程序,傳遞數(shù)據(jù),協(xié)調(diào)它們之間的操作。

          ActiveX服務(wù)器框架(ActiveX Server Framework);提供了一系列針對WEB服務(wù)器應(yīng)用程序設(shè)計各個方面的函數(shù)及其封裝類,諸如服務(wù)器過濾器、HTML數(shù)據(jù)流控制等。

          在Internet Explorer中內(nèi)置Java虛擬機(Java Virtual Machine),從而使Java Applet能夠在Internet Explorer上運行,并可以與ActiveX控制通過腳本描述語言進行通信。

          1.3. ActiveX與Java的比較

          ActiveX提供了一種擴展包括Java在內(nèi)的任何編程語言的機制,Java的開發(fā)人員可以在Applet中使用ActiveX技術(shù),直接嵌入 ActiveX控制,或者以ActiveX技術(shù)為橋梁,將其它開發(fā)商提供的多種語言的程序?qū)ο蠹傻絁ava中。與Java的字節(jié)碼技術(shù)相比, ActiveX提供了“代碼簽名”(Code Signing)技術(shù)保證其安全性。

          1.4. Internet Explorer和Netscape Navigator

          不言而喻,Microsoft的Internet Explorer全面支持ActiveX。同時,Microsoft提供了 Netscape Navigator的插? Plug-In),從而使Navigator也可以瀏覽包含有ActiveX部件的WEB站點。

          2. ActiveX控制和Internet

          ActiveX控制是OLE控制的更新版本。控制(Control)是建立可編程部件(Component)的主要元素。ActiveX控制可以用于所有支持COM規(guī)范的容器中,或者作為Internet控制嵌入到WEB頁面中。用戶訪問該頁面時將下載該控制并自動在本地注冊。利用腳本描述語言(Script)可以在控制之間以及客戶與服務(wù)器之間通過設(shè)置屬性(Property)、調(diào)用方法(Method)和激活事件(Event)進行通信。

          ActiveX控制與以前的OLE控制相比,具有更少的接口,并且可以沒有窗口。所有的ActiveX控制都支持IUnknown接口。

          目前,很多第三方開發(fā)商編制了各式各樣的ActiveX控制。在Internet上,有超過1000個ActiveX控制供用戶下載使用。在 WINDOWS的SYSTEM目錄下,保存有很多Window提供的ActiveX控制。Microsoft Visual C++(以下簡稱VC)提供的MFC(Microsoft Foundation Classes)控制都是ActiveX控制。

          考慮到當(dāng)前Internet相對較低的傳輸速率,設(shè)計運行于Internet的ActiveX控制時,必須考慮以下幾個問題:

          控制盡可能小;

          持續(xù)存儲數(shù)據(jù)(Persist Data)如何保存;

          如何在Internet上下載和安裝;

          控制如何在客戶端注冊;

          3. ActiveX文檔和Internet

          ActiveX文檔提供了傳統(tǒng)的嵌入對象的擴展方法。ActiveX文檔對象可以包含多個頁,顯示在整個客戶區(qū)中,并支持原有的菜單功能。與以往的嵌入對象不同的是,ActiveX文檔對象不再以一個陰影方框包圍來顯示,而是全框架(Full Frame),并總處于激活狀態(tài)。

          Microsoft Office97提供了Microsoft Office Binder,用來生成并瀏覽由Microsoft Word、 Microsoft Excel或者用戶定義的ActiveX文檔等構(gòu)成的復(fù)合文檔,每一種文檔類型都可以直接進行編輯修改。 ActiveX文檔可以作為對象嵌入到WEB網(wǎng)頁中,在WEB上發(fā)布。

          4. ActiveX腳本描述語言

          利用VBScript或者Microsoft JScript,可以向Web頁面中加入可用于交互的ActiveX控制,將數(shù)據(jù)預(yù)處理或者檢驗過程放在客戶端進行,然后將結(jié)果傳往WEB服務(wù)器。

          5. ActiveX服務(wù)器框架

          在WEB服務(wù)器上創(chuàng)建擴展應(yīng)用程序,動態(tài)生成WEB頁面。使用MFC提供的ISAPI類可以方便地建立WEB服務(wù)器端的擴展應(yīng)用程序。

          6. Visual C++ 5.0對ActiveX的支持

          VC++ 5.0(企業(yè)版)為Internet開發(fā)提供了完整的解決發(fā)案,其內(nèi)容是:

          使用MFC或者ATL開發(fā)ActiveX控制和ActiveX文檔。

          使用ISAPI設(shè)計WEB服務(wù)器端的部件。

          使用WinInet 開發(fā)通過Internet存取文件的應(yīng)用程序。

          使用Asynchronous Monikers生成從Internet下載數(shù)據(jù)的應(yīng)用程序。

          使用ActiveX SDK開發(fā)其它類型的基于Internet的Win32應(yīng)用程序,包括ActiveX Scripting Host,Microsoft WebConferencing等。

          6.1. 用VC5.0開發(fā)ActiveX控制

          VC++5.0提供兩個途徑開發(fā)ActiveX控制:MFC和ATL(Active Template Library)。使用MFC,可以不必理會控制接口的細節(jié),把注意力集中在控制本身的功用上,但是生成的控制比較大。而且,客戶端如果要運行此ActiveX控制,必須擁有相應(yīng)版本的MFC類庫的 DLL,否則,必須同時下載這些巨大的類庫;使用ATL,由于不涉及MFC的標準類庫,生成的控制相對較小,但開發(fā)者必須了解COM、OLE技術(shù)的細節(jié)。大多數(shù)情況下,可以使用MFC開發(fā)ActiveX控制,這樣比較容易。而且,由于Internet Explorer 3.0提供了MFC 4.1的類庫,而Internet Explorer 3.0是Windows95提供的組件,所以,只要ActiveX控制使用的是MFC 4.1或者更早的版本,多數(shù)情況下不需要下載MFC的類庫。

          使用MFC開發(fā)ActiveX控制,可以用MFC ActiveX Control Wizard生成工程框架。VC會自動產(chǎn)生三個類:(假設(shè)MyName是控制的名字。)

          CMyNameApp:從類COleControlModule派生,而類COleControlModule則派生自CWinApp;

          CMyNameCtrl:從類COleControl派生,而類COleControl則派生自CWnd;

          CMyNamePropPage:從類COlePropertyPage派生,而類COlePropPage則派生自CDialog;

          可以看出,這個框架與一般的MFC應(yīng)用程序有些類似。開發(fā)人員的大部分工作在CMyNameCtrl中,例如用Class Wizard添加屬性、方法和事件,處理顯示等。

          編譯生成OCX文件后,用VC提供的ActiveX Test Container測試這個控制,也可以用OLE/COM Object Viewer瀏覽此控制的接口信息及類型庫。

          6.2. ActiveX控制在WEB上的應(yīng)用

          考慮到WEB的安全性,為了在服務(wù)器與客戶端建立良好的信任關(guān)系,必須為每個在WEB上使用ActiveX控制設(shè)置一個“代碼簽名” (Code Signing)。VC5.0提供了生成供測試用的“代碼簽名”的工具。如果要正式發(fā)布,則必須向有關(guān)機構(gòu)申請。(參見http: //www.microsoft.com/intdev/signcode/)

          在WEB頁面中使用ActiveX控制,還要對之進行包裝,將有關(guān)的動態(tài)連接庫及信息文件壓縮到一個擴展名為CAB(Cabinet)文件中。可以使用VC5.0提供的工具包裝ActiveX控制。在HTML文件中,使用OBJECT標簽插入ActiveX控制,并利用VBScript或者 JScript訪問該ActiveX控制。客戶端用Internet Explorer瀏覽此頁面時,可以自動解包該文件。出于安全性的考慮, Internet Explorer為ActiveX 部件的下載、初始化、是否擁有合法的代碼簽名以及是否允許Scripting等設(shè)置了不同的安全級別,用戶可根據(jù)需要進行設(shè)置。下面這個例子中,使用了ActiveX控制“MSChart.OCX",當(dāng)用鼠標單擊此控制時,控制的標題將改變。

          ID=chart1 WIDTH=400 HEIGHT=200

          ALIGN=center>

          其中,Object ID是這個ActiveX DLL中某個類的名字。當(dāng)此WEB頁面被下載并顯示時,MyClass類的方法LogIn將被調(diào)用,并在客戶端顯示LogIn對話框。

          7.3. Visual Basic 6.0

          Microsoft計劃于1998年9月推出Visual Basic 6.0。目前Beta版正在測試。VB 6.0與VB5.0相比,除繼續(xù)支持 Internet Explorer Document Object Model(DOM)開發(fā)之外,將提供兩個令人興奮的新功能:

          Dynamic HTML編輯器

          開發(fā)人員可以象編制普通VB程序一樣,制作DHTML文件或模板。

          WebClasses;

          開發(fā)人員可以在WEB服務(wù)器端建立與ASP文件一一對應(yīng)的WebClass類,每個類都可以訪問ASP對象,在Visual Basic IDE中跟蹤調(diào)試,并生成 ISAPI 動態(tài)連接庫。

          8. 小結(jié)

          正如Internet和WEB技術(shù)一樣,ActiveX技術(shù)的發(fā)展日新月異,新的更強大的開發(fā)工具使得服務(wù)器及客戶端的應(yīng)用開發(fā)、網(wǎng)站建設(shè)變得更簡單,并容易擴展和重用。隨著Microsoft的包括Windows NT、Internet Information Server、 Active Server Pages以及Microsoft FrontPage、Internet Explorer等組件在內(nèi)完整的 Internet解決方案被廣泛使用,ActiveX技術(shù)將會有更大的發(fā)展。

          參考文獻:

          1. Visual C++技術(shù)內(nèi)幕(第二版),[美]David J. Kruglinski著,王國印譯,清華大學(xué)出版社。

          2. ActiveX開發(fā)人員指南,[美]Eric Tall,Mark Ginsburg著,章巍等譯,機械工業(yè)出版社。

          3. Visual Basic 6.0:You Wont Believe What Just Hit the Web, Joshua Trupin,Microsoft Interactive Network Developer(MIND),1998年8月。

          4. Introduction to ActiveX Controls,Microsoft Corp.,MSDN,1998年8月。

          5. Dynamic HTML and the Big Picture,John Swenson,MSDN Online,1997年11月。

          6. A Brief Preview of the Visual Basic 5.0 Development Environment,Michael Otey,Windows NT Magazine ,1997年4月。

          7. http://www.microsoft.com/,Microsoft公司,包括MSDN、MSJ等技術(shù)資源。

          8. http://www.ActiveX.com,第三方開發(fā)的ActiveX控制。

          9. http://www.Active-X.com,有關(guān)ActiveX技術(shù)的文檔資料。

          10. http://www.WinntMag.com,Windows NT Magazine雜志。

          弈安傳媒科技微課堂,每天分享財經(jīng)資訊,計算機技術(shù)知識,人生感悟,創(chuàng)業(yè)指導(dǎo)以及各種專業(yè)技術(shù)知識資料學(xué)習(xí)交流.移動學(xué)習(xí)平臺、知識分享平臺。隨時隨地的學(xué)習(xí),如果你喜歡成長,這里你不容錯過的地方.弈安傳媒科技培訓(xùn)關(guān)注:關(guān)注自己成長,分享內(nèi)容,分享自己的技術(shù),成就未來.

          [弈安傳媒科技提升自己的平臺]請關(guān)注:頭條號及公眾號 弈安傳媒科技

          WPF 或 WinForms 應(yīng)用程序選擇瀏覽器組件,對于那些搜索基于Chrome的解決方案的人來說, DotNetBrowser[1]CefSharp[2]是最明顯的選擇。

          本文是我們的客戶在考慮其項目的開源庫和商業(yè)庫時提出的最常見比較點的匯編。

          引擎

          CefSharp 實際上是 Chromium Embedded Framework[3] (CEF) 的 .NET 包裝器。包裝通過 C++/CLI 完成。

          DotNetBrowser 在底層不使用 CEF 或 C++/CLI。相反,它采用了自己的方法直接與 Chromium 集成。它啟動一個功能齊全的 Chromium 引擎,并通過進程間通信 (IPC) 與其進行通信。

          架構(gòu)

          在 CefSharp 中,Chromium 引擎直接在您的 .NET 進程中初始化[4]。初始化和關(guān)閉都必須在主應(yīng)用程序線程(通常是 UI 線程)中執(zhí)行。在不同的線程中調(diào)用它們通常會導(dǎo)致凍結(jié)。

          此外,每個進程可以執(zhí)行一次初始化和關(guān)閉。這個限制來自 CEF 本身。在執(zhí)行關(guān)閉后嘗試重新初始化 CefSharp 將導(dǎo)致錯誤。

          CefSharp architecture

          在 DotNetBrowser 中,Chromium 引擎在單獨的本機進程中進行初始化。不需要在主 UI 線程上執(zhí)行此操作——即使在工作線程中也可以執(zhí)行此操作。

          您可以同時初始化和使用具有不同配置的多個 Chromium 引擎,這在 CefSharp 中是不可能的。您可以在不再需要 Chromium 時將其關(guān)閉并隨時重新初始化。

          DotNetBrowser architecture

          穩(wěn)定性和內(nèi)存使用

          在單獨的進程中運行 Chromium 有更多優(yōu)點:

          1. 在這種情況下,內(nèi)存消耗要低得多,這對于 32 位應(yīng)用程序來說似乎很關(guān)鍵。
          2. 在 CefSharp 中,如果 CEF 或 C++/CLI 綁定內(nèi)部出現(xiàn)問題,這將導(dǎo)致整個 .NET 應(yīng)用程序崩潰而無法處理這種情況。這就不太妙了,因為 .NET 應(yīng)用程序可能會丟失或損壞用戶的數(shù)據(jù)。

          對于 DotNetBrowser,Chromium 內(nèi)部的錯誤不會導(dǎo)致 .NET 應(yīng)用程序崩潰。此外,甚至可以在托管代碼中正確檢測和處理這一切。例如,如果發(fā)生這種情況,那么您可以重新初始化 Chromium 并恢復(fù)用戶會話。

          應(yīng)用程序域

          由于其架構(gòu),CefSharp 不能在非默認 AppDomain 中使用[5]。因此,它不能用于通過 VSTO 插件或 Excel-DNA 將 Chromium 嵌入到 Office 應(yīng)用程序中[6]。Office VSTO 將加載項加載到單獨的 AppDomain 中以進行隔離。DotNetBrowser 在非默認 AppDomain 中運行。事實上,可以在不同的 AppDomain 中創(chuàng)建多個 Chromium 引擎并同時使用它們。因此,DotNetBrowser 可用于創(chuàng)建 VSTO 加載項。

          AnyCPU

          在針對 AnyCPU 的應(yīng)用程序中使用 CefSharp 時,您會發(fā)現(xiàn)它在這些應(yīng)用程序的 64 位環(huán)境中無法正常工作。

          這兒有幾個選項[7]可以解決這個問題。其中之一是讓您的應(yīng)用程序始終在 32 位模式下運行,另一個更復(fù)雜,需要修改項目文件(.csproj.vbproj)和代碼。

          在 DotNetBrowser 中,AnyCPU 支持開箱即用。因此,不需要類似的調(diào)整。

          H.264, AAC

          視頻和音頻通常使用專有編解碼器進行編碼,例如 H.264 和 AAC。此媒體無法在 CefSharp 中播放。

          要在 CefSharp 中啟用這些編解碼器,您需要在啟用專有編解碼器的情況下自行重建 CEF。這是一項相當(dāng)復(fù)雜的任務(wù),可能需要長達一個月的時間[8]

          在 DotNetBrowser 中默認禁用專有編解碼器。可以通過編程方式啟用它們,而無需重建庫:

          InitializeCodecs.cs

          IEngine engine = EngineFactory.Create(new EngineOptions.Builder
          {
          ProprietaryFeatures = ProprietaryFeatures.H264 | ProprietaryFeatures.Aac
          }.Build());

          安全

          Chromium 通過利用操作系統(tǒng)為它們提供的安全性來限制其渲染器和實用程序進程。此功能稱為 Chromium沙箱[9]。其主要目的是防止第三方代碼對計算機進行持久更改或訪問機密信息。

          CefSharp 不支持 Chromium 沙箱[10]。這個限制來自 CEF 本身。

          DotNetBrowser 支持沙箱并默認啟用。如有必要,可以在初始化期間將其禁用[11]

          CefSharp 在 .NET 進程中啟動 Chromium。這使您的應(yīng)用程序容易受到 CEF 和 Chromium 中的漏洞的影響。如果惡意軟件獲得了對 Chromium 內(nèi)存的訪問權(quán),它也會獲得對 .NET 內(nèi)存的訪問權(quán)。

          DotNetBrowser 在單獨的進程中啟動 Chromium。

          Chromium 漏洞保留在 Chromium 中。

          Visual Studio設(shè)計器

          現(xiàn)代 WPF 和 Windows 窗體應(yīng)用程序通常是在設(shè)計器的幫助下在 Visual Studio 中創(chuàng)建的。這種方法總體上簡化了 UI 創(chuàng)建并節(jié)省了大量時間和精力。

          CefSharp 提供有限的設(shè)計器支持[12]。如果應(yīng)用程序本身以 x86 為目標,則其控件將在設(shè)計器中正確處理。AnyCPU 可能會工作,但尚未經(jīng)過徹底測試。

          DotNetBrowser 控件是純 UI 控件,它們在代碼中顯式初始化。您可以在設(shè)計器中不受任何限制地使用它們。安裝 NuGet 包或 VSIX 擴展后,BrowserView 控件出現(xiàn)在工具箱中。它可以像任何其他常規(guī) UI 控件一樣被拖到窗體或窗口上。

          嵌入應(yīng)用程序 UI

          CefSharp 提供 WPF 和 Windows 窗體支持。但是,它的 WPF 實現(xiàn)只能在離屏渲染模式[13]下工作。此實現(xiàn)具有有限的觸摸屏和 IME[14] 支持。

          DotNetBrowser 在兩種渲染模式下同時支持 WPF 和 Windows 窗體。在硬件加速模式下,觸摸、手勢和 IME 由 Chromium 自行處理,因此它們開箱即用。在離屏模式下,存在一些已知的限制[15]

          以下是將 CefSharp 嵌入 WPF 窗口的方法:

          <Window x:Class="CefSharpWpf.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:wpf="clr-namespace:CefSharp.Wpf;assembly=CefSharp.Wpf"
          Title="MainWindow" Height="450" Width="800">

          <Grid>
          <wpf:ChromiumWebBrowser Address="https://www.google.com"/>
          </Grid>
          </Window>

          就是這樣,在最簡單的情況下,不再需要編寫代碼。但是,在這種情況下,CefSharp 初始化和關(guān)閉是隱式執(zhí)行的,很難確定它是否已經(jīng)在某個點初始化。

          將 DotNetBrowser 嵌入 WPF 窗口的過程需要額外的步驟。

          例如:

          MainWindow.xaml

          <Window
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:WPF="clr-namespace:DotNetBrowser.Wpf;assembly=DotNetBrowser.Wpf"
          x:Class="Embedding.Wpf.MainWindow"
          Title="MainWindow" Height="480" Width="800" Closed="Window_Closed">

          <Grid>
          <WPF:BrowserView Name="browserView" />
          </Grid>
          </Window>

          MainWindow.xaml.cs

          public partial class MainWindow : Window
          {
          private const string Url = "https://www.google.com";
          private readonly IBrowser browser;
          private readonly IEngine engine;

          public MainWindow()
          {
          // Create and initialize the IEngine instance.
          EngineOptions engineOptions = new EngineOptions.Builder
          {
          RenderingMode = RenderingMode.HardwareAccelerated
          }.Build();
          engine = EngineFactory.Create(engineOptions);

          // Create the IBrowser instance.
          browser = engine.CreateBrowser();

          InitializeComponent();

          // Initialize the WPF BrowserView control.
          browserView.InitializeFrom(browser);
          browser.Navigation.LoadUrl(Url);
          }

          private void Window_Closed(object sender, EventArgs e)
          {
          browser?.Dispose();
          engine?.Dispose();
          }
          }

          在這里,大部分代碼都與 Chromium 實例和 IBrowser 實例的顯式初始化和關(guān)閉有關(guān)。UI 控件初始化是通過調(diào)用 InitializeFrom() 顯式執(zhí)行的。這種方法可以更好地控制初始化和關(guān)閉過程,并且更容易自定義初始 Chromium 配置。

          高DPI

          在 CefSharp 中,瀏覽器子進程的 默認 DPI 感知[16] 是 Per-Monitor。因此,桌面應(yīng)用程序應(yīng)具備 DPI 感知功能,才能在高 DPI 顯示器(DPI 比例設(shè)置大于 100% 的顯示器)上正確運行。在其他情況下,瀏覽器內(nèi)容可能無法正確呈現(xiàn),例如:

          DotNetBrowser 以不同的方式支持高 DPI。在初始化過程中,它會檢查當(dāng)前進程的 DPI 感知,并為相應(yīng)的 Chromium 引擎設(shè)置匹配的 DPI 感知。因此,無需讓您的應(yīng)用程序顯式識別 DPI 以避免在高 DPI 顯示上呈現(xiàn)偽影。

          Headless

          DotNetBrowser 和 CefSharp 都可以在沒有 UI 的應(yīng)用程序中使用。

          在 CefSharp 中,CefSharp.OffScreen.ChromiumWebBrowser 用于此目的。初始化過程通常保持不變。但是,如果您的代碼使用 async/await 模式,則需要使用同步上下文來確保在主線程上而不是在不同的工作線程上執(zhí)行初始化和關(guān)閉。

          要在沒有 UI 的應(yīng)用程序中使用 DotNetBrowser,您需要像往常一樣執(zhí)行初始化。在這種情況下,沒有需要初始化的 BrowserView。即使您的代碼使用async/await模式,也無需創(chuàng)建和使用同步上下文。

          API和功能

          這兩種產(chǎn)品都有許多可用的功能。在本文中,我將比較幾個最重要的,以展示 API 的不同之處。

          DOM訪問

          在 CefSharp 中,您只能通過執(zhí)行 JavaScript 調(diào)用來訪問 DOM。

          例如:

          CefSharpDom.cs

          var script = @"
          document.getElementsByName('question')[0].value = 'CefSharp Example';
          document.getElementsByName('btn')[0].click();
          "
          ;
          browser.ExecuteScriptAsync(script);

          DotNetBrowser 提供了豐富的 DOM API,可用于直接從 .NET 執(zhí)行以下操作:

          • 訪問和修改 DOM 樹;
          • 更改 HTML 元素屬性;
          • 訂閱 DOM 事件并從 .NET 代碼中調(diào)度它們。

          例如,以下是如何在 DotNetBrowser 中的網(wǎng)頁上執(zhí)行相同的操作:

          DotNetBrowserDom.cs

          IDocument document = browser.MainFrame.Document;
          (document.GetElementByName("question") as IInputElement).Value = "DotNetBrowser Example";
          document.GetElementByName("btn").Click();

          因此,在 DotNetBrowser 中與網(wǎng)頁執(zhí)行復(fù)雜的交互要方便得多。無需編寫難以調(diào)試和支持的復(fù)雜 JavaScript 代碼。DotNetBrowser 中的 DOM API 不是一組 JavaScript 調(diào)用的包裝器。它直接對 Blink 引擎進行 IPC 調(diào)用。

          與JavaScript交互

          執(zhí)行JavaScript并處理結(jié)果

          CefSharp 和 DotNetBrowser 都提供了在網(wǎng)頁上執(zhí)行 JavaScript 的能力。

          在 CefSharp 中,有兩種方法可用于此目的,ExecuteJavaScriptAsyncEvaluateScriptAsync。兩者都可用于瀏覽器本身(通過擴展方法)或其中的一個框架:

          CefSharpExecuteJs.cs

          // Execute JavaScript without returning a result. The method returns 
          // before the script has actually been executed.
          browser.ExecuteJavaScriptAsync("alert('All Resources Have Loaded');");

          // Evaluate some Javascript code. The script will be executed asynchronously
          // and the method returns a Task encapsulating the response from the
          // JavaScript.
          JavascriptResponse response = await browser.EvaluateScriptAsync(script);

          然后使用 JavascriptResponse.Result 獲取執(zhí)行結(jié)果。

          可能的結(jié)果類型有 bool, int, long, double, string, List<object>``, IDictionary<string, object>``, 和 IJavascriptCallback。這里的集合是 JavaScript 集合的快照表示,而 IJavascriptCallback 是一種 JavaScript 函數(shù)表示,可用于從 .NET 端執(zhí)行它。

          在 DotNetBrowser 中,有 IFrame.ExecuteJavaScript() 用于此目的。此方法的通用版本可用于顯式指定預(yù)期的返回類型:

          DotNetBrowserJavaScript.cs

          string title = await browser.MainFrame.ExecuteJavaScript<string>("document.title");
          IJsObject window = await browser.MainFrame.ExecuteJavaScript<IJsObject>("window");
          IElement body = await browser.MainFrame.ExecuteJavaScript<IElement>("document.body");

          這里的主要區(qū)別是可以將 JavaScript 對象表示為IJsObject。使用此接口,您可以訪問和修改 JavaScript 對象的屬性并調(diào)用其方法。在 .NET 端對 IJsObject 所做的所有更改都將立即反映在 JavaScript 端。此外, ExecuteJavaScript 調(diào)用可以返回一個 IElement,這是一個 DOM 元素的表示,您可以使用它來訪問和修改 DOM 屬性或訂閱 DOM 事件。

          從JavaScript調(diào)用.NET

          CefSharp 和 DotNetBrowser 都可以使網(wǎng)頁上的 JavaScript 可以訪問 .NET 對象,但是,CefSharp 存在一些特定的限制。

          CefSharp JavaScript 綁定可用于 JavaScript 和 .NET 之間的通信。但是,CefSharp 不允許[17]將Form, Window 或任何Control注入 JavaScript。另外,CefSharp 只支持調(diào)用注入對象的方法。如果需要設(shè)置屬性,則必須修改類并創(chuàng)建 Get/Set 方法。

          在 DotNetBrowser 中,您可以將任何對象注入 JavaScript,包括 Form, Window 和 Control 對象。執(zhí)行注入后,您可以訪問注入的 .NET 對象的公共字段、屬性和方法。此外,DotNetBrowser 支持從 JavaScript 訪問索引屬性(使用字符串或數(shù)字索引器)。如果您需要從 JavaScript 訪問 .NET 集合,這會很有幫助。

          截屏

          兩種解決方案都支持在瀏覽器不可見時進行截屏。但是,API 有明顯不同。以下是代碼片段:

          CefSharpScreenshot.cs

          // Take a screenshot
          var bitmapAsByteArray = await browser.CaptureScreenshotAsync();

          // Save the screenshot as PNG
          var screenshotPath = Path.GetFullPath("screenshot.png");
          File.WriteAllBytes(screenshotPath, bitmapAsByteArray);

          DotNetBrowserScreenshot.cs

          // Take a screenshot
          DotNetBrowser.Ui.Bitmap image = browser.TakeImage();

          // Convert the screenshot to System.Drawing.Bitmap and save it as PNG
          System.Drawing.Bitmap bitmap = image.ToBitmap();
          bitmap.Save("screenshot.png", ImageFormat.Png);

          主要的 DotNetBrowser DLL 不使用 System.Drawing 中的類型,因為它的限制[18],因此,它提供了自己的類型。然后可以通過 DotNetBrowser.WpfDotNetBrowser.WinForms 中提供的擴展方法將此類型轉(zhuǎn)換為常規(guī) System.Drawing.Bitmap。

          分發(fā)和部署

          CefSharp 需要 Microsoft Visual C++ 運行時存在于環(huán)境中[19]。Visual C++ 2015 是最低版本,但所需的確切版本取決于 Chromium 版本。因此,需要在您希望運行基于 CefSharp 的應(yīng)用程序的每臺機器上預(yù)安裝 Microsoft Visual C++ Redistributable Package,將其設(shè)置為安裝程序的依賴項,或?qū)⑵?DLL 打包為應(yīng)用程序的一部分,并確保 CefSharp 正確找到它們。

          在 DotNetBrowser 中,所有必需的 Chromium 二進制文件和 DLL 都已打包到 DotNetBrowser DLL 中,并且可以在執(zhí)行期間自動提取。您無需預(yù)先安裝 Microsoft Visual C++ Runtime 即可使用 DotNetBrowser。

          支持和更新

          CefSharp 是一個開源項目。如果您發(fā)現(xiàn)錯誤或缺少功能,您可以提出建議[20]

          DotNetBrowser是為使用.NET開發(fā)軟件的商業(yè)公司設(shè)計和創(chuàng)建的商業(yè)產(chǎn)品,對集成第三方解決方案的質(zhì)量和支持有很高的要求。自 2015 年以來,TeamDev 開發(fā)并支持 DotNetBrowser。

          我們所有已訂閱有效標準支持[21]的客戶都可免費使用所有DotNetBrowser 新版本并獲得技術(shù)支持。如果您發(fā)現(xiàn)錯誤或缺少功能,我們將應(yīng)用修復(fù)程序,實施所需功能,并根據(jù)任務(wù)的復(fù)雜性在幾天或幾周內(nèi)為您提供新版本的庫。

          幾乎每個月都會發(fā)布一個新版本的 DotNetBrowser。我們會在 Chromium 正式發(fā)布后的 3-4 周內(nèi)將 Chromium 升級到最新的穩(wěn)定版本(帶有最新的安全補丁和修復(fù)的漏洞)。

          概括

          因為開源和免費,CefSharp 被廣泛使用。它很容易為基本案例進行配置,并且擁有廣泛的文檔和活躍的開源開發(fā)者社區(qū)。

          但是,它具有來自其設(shè)計和架構(gòu)的限制。缺少沙盒支持使其安全性降低,并且進程內(nèi)方法會影響穩(wěn)定性并增加應(yīng)用程序的內(nèi)存使用量。

          它也不能用于暗示在單獨的 AppDomain(如 VSTO)中運行代碼的環(huán)境。對于其他一些情況,例如播放使用專有編解碼器編碼的內(nèi)容,您必須自己構(gòu)建、更新和維護 CEF。這需要大量額外的工作和基礎(chǔ)設(shè)施。

          與加載的網(wǎng)頁的復(fù)雜交互會通過 JavaScript 注入執(zhí)行,這使得生成的代碼更難調(diào)試和支持。

          DotNetBrowser 簡化了所有這些案例的開發(fā)過程——由于它的進程外架構(gòu),它可以用于創(chuàng)建更穩(wěn)定和安全的解決方案。使用 DotNetBrowser,您可以與需要在單獨的 AppDomain 中運行代碼的應(yīng)用程序集成,并在網(wǎng)頁上執(zhí)行復(fù)雜的操作,而無需進行大量的 JavaScript 注入。

          除此之外,如果您覺得缺少哪些功能、發(fā)現(xiàn)問題或有其他任何疑問,您可以隨時與我們聯(lián)系并獲得幫助[22]

          參考資料

          [1]

          DotNetBrowser: https://www.teamdev.com/dotnetbrowser?utm_campaign=dotnetbrowser-articles&utm_medium=article&utm_source=medium

          [2]

          CefSharp: http://cefsharp.github.io/

          [3]

          Chromium Embedded Framework: https://bitbucket.org/chromiumembedded/cef/src/master/

          [4]

          引擎直接在您的 .NET 進程中初始化: https://github.com/cefsharp/CefSharp/wiki/General-Usage#initialize-and-shutdown

          [5]

          CefSharp 不能在非默認 AppDomain 中使用: https://github.com/cefsharp/CefSharp/wiki/General-Usage#need-to-knowlimitations

          [6]

          將 Chromium 嵌入到 Office 應(yīng)用程序中: https://docs.microsoft.com/en-us/visualstudio/vsto/architecture-of-vsto-add-ins

          [7]

          幾個選項: https://github.com/cefsharp/CefSharp/issues/1714

          [8]

          可能需要長達一個月的時間: https://greenlightstudionet.wordpress.com/2019/10/09/stream-netflix-in-your-c-sharp-program/amp/

          [9]

          Chromium沙箱: https://www.google.com/googlebooks/chrome/med_26.html

          [10]

          不支持 Chromium 沙箱: https://github.com/cefsharp/CefSharp/wiki/General-Usage#need-to-knowlimitations

          [11]

          初始化期間將其禁用: https://dotnetbrowser-support.teamdev.com/docs/guides/gs/chromium.html#windows?utm_campaign=dotnetbrowser-articles&utm_medium=article&utm_source=medium

          [12]

          提供有限的設(shè)計器支持: https://github.com/cefsharp/CefSharp/wiki/General-Usage#need-to-knowlimitations

          [13]

          離屏渲染模式: https://github.com/cefsharp/CefSharp/wiki/General-Usage#offscreen-rendering-osr

          [14]

          IME: https://github.com/cefsharp/CefSharp/issues/1262

          [15]

          已知的限制: https://dotnetbrowser-support.teamdev.com/docs/guides/gs/browser-view.html#mouse-keyboard-touch-drag-and-drop?utm_campaign=dotnetbrowser-articles&utm_medium=article&utm_source=c-sharpcorner

          [16]

          默認 DPI 感知: https://github.com/cefsharp/CefSharp/wiki/General-Usage#high-dpi-additional-info

          [17]

          不允許: https://github.com/cefsharp/CefSharp/wiki/General-Usage#binding-an-async-object-in-javascript

          [18]

          它的限制: https://docs.microsoft.com/en-us/dotnet/api/system.drawing?view=netstandard-2.0#remarks

          [19]

          Microsoft Visual C++ 運行時存在于環(huán)境中: https://github.com/cefsharp/CefSharp/wiki/Output-files-description-table-%28Redistribution%29#Requirements

          [20]

          提出建議: https://github.com/cefsharp/CefSharp

          [21]

          標準支持: https://dotnetbrowser-support.teamdev.com/getting-help/#standard-support?utm_campaign=dotnetbrowser-articles&utm_medium=article&utm_source=medium

          [22]

          聯(lián)系并獲得幫助: https://dotnetbrowser-support.teamdev.com/getting-help?utm_campaign=dotnetbrowser-articles&utm_medium=article&utm_source=medium

          文把程序員所需掌握的關(guān)鍵知識總結(jié)為三大類19個關(guān)鍵概念,然后給出了掌握每個關(guān)鍵概念所需的入門書籍和必讀書籍,旨在成為最好最全面的程序員必讀書單,幫助廣大IT人士實現(xiàn)自我提升。在書單中,我把程序員應(yīng)掌握的關(guān)鍵概念分為程序設(shè)計,軟件開發(fā),以及個人成長三大類,每一大類均由若干關(guān)鍵概念組成。

          程序設(shè)計

          1. 基礎(chǔ)理論

          編碼

          編碼:隱匿在計算機軟硬件背后的語言,這本書其實不應(yīng)該叫編碼——它更應(yīng)該叫“Petzold教你造計算機”——作者 Charles Petzold 創(chuàng)造性的以編碼為主題,從電報機和手電筒講到數(shù)字電路,然后利用數(shù)字電路中的邏輯門構(gòu)造出加法器 和觸發(fā)器,最后構(gòu)造出一個完整的 存儲程序計算機 。不要被這些電路概念嚇到—— 編碼使用大量形象貼切的類比簡化了這些概念,使其成為最精彩最通俗易懂的計算機入門讀物。

          深入理解計算機系統(tǒng)

          深入理解計算機系統(tǒng)(第2版) 這本書的全名是:Computer Systems:A Programmer’s Perspective,所以它又被稱為 CSAPP。

          深入理解計算機系統(tǒng)這本書是我讀過的最優(yōu)秀的計算機系統(tǒng)導(dǎo)論型作品,它創(chuàng)造性的把操作系統(tǒng),計算機組成結(jié)構(gòu),數(shù)字電路,以及編譯原理這些計算機基礎(chǔ)學(xué)科中的核心概念匯集在一起,從而覆蓋了指令集體系架構(gòu),匯編語言,代碼優(yōu)化,計算機存儲體系架構(gòu),鏈接,裝載,進程,以及虛擬內(nèi)存這些程序員所需了解的關(guān)鍵計算機系統(tǒng)知識。如果想打下扎實的計算機基礎(chǔ)又不想把操作系統(tǒng)計算機結(jié)構(gòu)編譯原理這些書統(tǒng)統(tǒng)讀一遍,閱讀 深入理解計算機系統(tǒng)是最有效率的方式。

          2. 編程語言

          編程語言是程序員必不可少的日常工具。工欲善其事,必先利其器。我在這里給出了 C,C++,Java,C#,JavaScript,和Python 這六種 常用編程語言的書單,我個人不熟悉 Objective-C 和PHP,因此它們不在其中。

          需要注意的是:我在這里給出的是編程語言Programming Language書籍,而非編程平臺Programming Platform書籍。以 Java 為例, Effective Java 屬于編程語言書籍,而 Android編程權(quán)威指南 就屬于編程平臺書籍。

          C

          對于C語言初學(xué)者,最難的概念不僅僅是指針和數(shù)組,還有指向數(shù)組的指針和指向指針的指針。C和指針花了大量的篇幅和圖示來把這些難懂但重要的概念講的清清楚楚,這也是我推薦它作為C語言入門讀物的原因。

          C程序設(shè)計語言

          盡管C程序設(shè)計語言這本書是二十多年前的書籍,但它仍然是C語言——以及計算機科學(xué)中最重要的書籍之一,它的重要性不僅僅在于它用清晰的語言和簡練的代碼描述了 C 語言全貌,而且在于它為之后的計算機書籍——尤其是編程語言書籍樹立了新的標桿。

          C++ 程序設(shè)計原理與實踐

          作為C++的發(fā)明者,沒有人能比 Bjarne Stroustrup 更理解C++。Bjarne在Texas A&M大學(xué)任教時使用C++為大學(xué)新生講授編程,從而就有了 C++ 程序設(shè)計原理與實踐這本書——它面向編程初學(xué)者,既包含 C++ 教程,也包含大量程序設(shè)計原則。它不但是我讀過最好的C++入門書,也是我讀過最好的編程入門書。

          比較有趣的是, C++ 程序設(shè)計原理與實踐 直到全書過半都沒有出現(xiàn)指針,我想這可能是Bjarne為了證明不學(xué)C也可以學(xué)好C++吧。

          C++

          同樣是 Bjarne Stroustrup 的作品, C++ 程序設(shè)計語言 是 C++ 最權(quán)威且最全面 的書籍。第4版相對于之前的版本進行了全面的更新,覆蓋了第二新的C++ 11標準,并砍掉了部分過時的內(nèi)容。

          Java

          平心而論Java核心技術(shù) (即Core Java)并不算是一本特別出色的書籍:示例代碼不夠嚴謹,充斥著很多與C/C++的比較,語言也不夠簡潔——問題在于Java并沒有一本很出色的入門書籍,與同類型的Java編程思想 相比,Java核心技術(shù) 至少做到了廢話不多,與時俱進(Java編程思想 還停留在 Java 6之前),矮子里面選將軍,Java核心技術(shù)算不錯了。

          Effective Java

          盡管Java沒有什么出色的入門書籍,但這不代表 Java 沒有出色的必讀書籍。Effective Java是我讀過的最好的編程書籍之一,它包含大量的優(yōu)秀Java編程實踐,并對泛型和并發(fā)這兩個充滿陷阱的Java特性給出了充滿洞察力的建議,以至于Java之父 James Gosling為這本書作序:“我很希望 10 年前就擁有這本書。可能有人認為我不需要任何 Java 方面的書籍,但是我需要這本書。”

          C#

          C#的語言特性非常豐富,很難用簡短的篇幅概括這些特性;

          精通 C#之所以有近 1200 頁的篇幅,是因為它不但全面介紹了 C# 語言,而且還覆蓋了 ADO.NET,WCF,WF,WPF,以及 ASP.NET 這些 .Net 框架。你可以把這本書視為兩本書——一本 500 多頁的 C# 語言教程和一本 600 多頁的 .Net 平臺框架快速上手手冊。

          盡管標題帶有“精通”兩字, 精通 C# 實際上是一本面向初學(xué)者的C#書籍,你甚至不需要太多編程知識,就可以讀懂它。

          CLRviaC#

          CLRviaC#是C#/.Net最重要的書籍,沒有之一。它全面介紹了.Net 的基石—— CLR的運行原理,以及構(gòu)建于CLR之上的 C# 類型系統(tǒng),運行時關(guān)系,泛型,以及線程/并行等高級內(nèi)容。任何一個以 C# 為工作內(nèi)容的程序員都應(yīng)該閱讀此書。

          JavaScript

          盡管JavaScript現(xiàn)在可以做到客戶端服務(wù)器端通吃,盡管 JQuery 之類的前端框架使得一些人可以不懂JavaScript也可以編程,但我還是認為學(xué)習(xí)JavaScript從HTML DOM開始最為適合,因為這是JavaScript設(shè)計的初衷。 JavaScript DOM編程藝術(shù)系統(tǒng)的介紹了如何使用JavaScript,HTML,以及 CSS 創(chuàng)建可用的 Web 頁面,是一本前端入門佳作。

          JavaScript語言

          JavaScript語言包含大量的陷阱和誤區(qū),但它卻又有一些相當(dāng)不錯的特性,這也是為什么 Douglas Crockford 稱JavaScript為 世界上最被誤解的語言 ,并編寫了 JavaScript 語言精粹 一書來幫助前端開發(fā)者繞開JavaScript中的陷阱。和同類書籍不同, JavaScript 語言精粹 用精煉的語言講解了JavaScript語言中好的那部分(例如閉包,函數(shù)是頭等對象,以及對象字面量),并建議讀者 不要 使用其它不好的部分(例如混亂的類型轉(zhuǎn)換,默認全局命名空間,以及 奇葩的相等判斷符 ),畢竟,用糟糕的特性編寫出來的程序往往也是糟糕的。

          Python

          Python 的入門書籍很多,而且據(jù)說質(zhì)量大多不錯,我推薦 Python 基礎(chǔ)教程 的原因是因為它是我的Python入門讀物——簡潔,全面,代碼質(zhì)量很不錯,而且有幾個很有趣的課后作業(yè),使得我可以快速上手。

          這里順便多說一句,不要用 Python 學(xué)習(xí)手冊 作為Python入門——它的廢話實在太多,你能想象它用了15頁的篇幅去講解if語句嗎?盡管 O’Reilly 出了很多經(jīng)典編程書,但這本 Python 學(xué)習(xí)手冊 絕對不在其中。

          Python 參考手冊

          權(quán)威且實用 Python 書籍,覆蓋 Python 2和 Python 3。盡管它名為參考手冊,但 Python 參考手冊 在 Python 語法和標準庫基礎(chǔ)之上對其實現(xiàn)機制也給出了深入的講解,不容錯過。

          編程語言理論

          編程語言實現(xiàn)模式

          大多數(shù)程序員并不需要從頭編寫一個編譯器或解釋器,因此龍書(編譯原理) 就顯得過于重量級;然而多數(shù)程序員還是需要解析文本,處理配置文件,或者寫一個小語言,編程語言實現(xiàn)模式很好的滿足了這個需求。它把常用的文本解析/代碼生成方法組織成一個個模式,并為每個模式給出了實例和應(yīng)用場景。這本書既會提高你的動手能力,也會加深你對編程語言的理解。Python發(fā)明者Guido van Rossum甚至為這本書給出了“Throw away your compiler theory book!” 這樣的超高評價。

          程序設(shè)計語言——實踐之路

          程序員每天都要和編程語言打交道,但是思考編程語言為什么會被設(shè)計成這個樣子的程序員并不多, 程序設(shè)計語言—實踐之路這本書完美的回答了這個問題。

          這本書從編程語言的解析和運行開始講起,系統(tǒng)了介紹了命名空間,作用域,控制流,數(shù)據(jù)類型以及方法(控制抽象)這些程序設(shè)計語言的核心概念,然后展示了這些概念是如何被應(yīng)用到過程式語言,面向?qū)ο笳Z言,函數(shù)式語言,腳本式,邏輯編程語言以及并發(fā)編程語言這些具有不同編程范式的編程語言之上。這本書或極大的拓寬你的視野——無論你使用什么編程語言,都會從這本書中獲益良多。理解這一本書,勝過學(xué)習(xí)十門新的編程語言。

          4. 程序設(shè)計

          程序設(shè)計方法

          現(xiàn)代編程語言的語法大多很繁雜,初學(xué)者使用這些語言學(xué)習(xí)編程會導(dǎo)致花大量的時間在編程語言語法(諸如指針,引用和類型定義)而不是程序設(shè)計方法(諸如數(shù)據(jù)抽象和過程抽象)之上。 程序設(shè)計方法 解決了這個問題——它專注于程序設(shè)計方法,使得讀者無需把大量時間花在編程語言上。這本書還有一個與之配套的教學(xué)開發(fā)環(huán)境 DrScheme ,這個環(huán)境會根據(jù)讀者的程度變換編程語言的深度,使得讀者可以始終把注意力集中在程序設(shè)計方法上。

          我個人很奇怪 程序設(shè)計方法 這樣的佳作為什么會絕版,而譚浩強C語言這樣的垃圾卻大行其道——好在是程序設(shè)計方法 第二版 已經(jīng)被免費發(fā)布在網(wǎng)上。

          計算機程序的構(gòu)造與解釋

          計算機程序的構(gòu)造與解釋是另一本被國內(nèi)大學(xué)忽視(至少在我本科時很少有人知道這本書)的教材,這本書和程序設(shè)計方法有很多共同點——都使用 Scheme 作為教學(xué)語言;都專注于程序設(shè)計方法而非編程語言本身;都擁有相當(dāng)出色的課后題。相對于 程序設(shè)計方法 , 計算機程序的構(gòu)造與解釋 要更加深入程序設(shè)計的本質(zhì)(過程抽象,數(shù)據(jù)抽象,以及元語言抽象),以至于 Google 技術(shù)總監(jiān) Peter Norvig 給了這本書 超高的評價 。

          5. 算法與數(shù)據(jù)結(jié)構(gòu)

          算法

          算法這本書的使用更為容易的Java語言作為教學(xué)語言;覆蓋所有常用的數(shù)據(jù)結(jié)構(gòu)和算法,并均給出其完整實現(xiàn);包含大量的圖示用于可視化算法——事實上這是我度過的圖示最為豐富形象的書籍,這也是被稱為最好的算法入門書籍的原因。

          編程珠璣(第 2 版)

          編程珠璣(第 2 版)是一本少見的實踐型算法書籍——它并非一一介紹數(shù)據(jù)結(jié)構(gòu)/算法的教材,而是實踐性極強的算法應(yīng)用手冊。作者( Jon Bentley )從他多年的實際經(jīng)驗精選出一些有趣而又實用的問題,然后展示了他解決這些問題的過程(分析問題,選擇合適的算法,解決問題,以及驗證答案)。任何程序員都可以從中獲益。

          6. 程序調(diào)試

          調(diào)試九法

          一個讓非編程從業(yè)人員驚訝的事實是程序員的絕大多時間都花在調(diào)試上,而不是寫程序上,以至于 Bob 大叔把調(diào)試時間占工作時間的比例作為衡量程序員開發(fā)能力的標準。 調(diào)試九法——軟硬件錯誤的排查之道 既是調(diào)試領(lǐng)域的入門作品,也是必讀經(jīng)典之作。 調(diào)試九法這本書的作者是一個具有豐富實戰(zhàn)經(jīng)驗的硬件工程師,他把他多年的調(diào)試經(jīng)驗總結(jié)成九條調(diào)試法則,并對每一條法則都給對應(yīng)的實際案例。任何程序員都應(yīng)通過閱讀這本書改善調(diào)試效率,即便是非程序員,也可以從這本書中學(xué)到系統(tǒng)解決問題的方法。

          軟件開發(fā)

          1. 編程實踐

          程序設(shè)計實踐

          Brian Kernighan 是這個星球上最好的計算機書籍作者:從上古時期的 Software Tools ,到早期的 Unix編程環(huán)境 和 C 程序設(shè)計語言,再到這本程序設(shè)計實踐 ,每本書都是必讀之作。

          盡管程序設(shè)計實踐只有短短 200 余頁,但它使用精煉的代碼和簡要的原則覆蓋了程序設(shè)計的所有關(guān)鍵概念(包括編程風(fēng)格,算法與數(shù)據(jù)結(jié)構(gòu),API 設(shè)計,調(diào)試,測試,優(yōu)化,移植,以及領(lǐng)域特定語言等概念)。如果你想快速掌握良好的編程實踐,或者你覺著900多頁的代碼大全過于沉重,那么程序設(shè)計實踐是你的不二之選。我第一次讀這本書就被它簡潔的語言和優(yōu)雅的代碼所吸引,以至于讀研時我買了三本程序設(shè)計實踐——一本放在學(xué)校實驗室,一本放在宿舍,一本隨身攜帶閱讀。我想我至少把它讀了十遍以上——每一次都有新的收獲。

          代碼大全

          無論在哪個版本的程序員必讀書單,代碼大全都會高居首位。和其它程序設(shè)計書籍不同, 代碼大全這本書用通俗清晰的語言覆蓋了軟件構(gòu)建(Software Construction)中各個層次上所有的重要概念——從變量命名到類型設(shè)計,從控制循環(huán)到代碼結(jié)構(gòu),從測試和調(diào)試到構(gòu)建和集成,代碼大全可謂無所不包,你可以把這本書看作為程序員的一站式(Once and for all)閱讀手冊。

          更珍貴的是, 代碼大全 在每一章末尾都給出了價值很高的參考書目(參考我之前的 如何閱讀書籍 一文),如果你是一個初出茅廬的程序員,代碼大全是絕好的閱讀起點。

          2. 面向?qū)ο蟪绦蛟O(shè)計

          Head First

          無論是在Amazon還是在Google上搜索設(shè)計模式相關(guān)書籍,Head First設(shè)計模式都會排在首位——它使用風(fēng)趣的語言和詼諧的圖示講述了觀察者、裝飾者,抽象工廠,和單例等關(guān)鍵設(shè)計模式,使得初學(xué)者可以迅速的理解并掌握設(shè)計模式。 Head First 設(shè)計模式 在Amazon上 好評如潮,就連設(shè)計模式原書作者 Erich Gamma 都對它給出了很高的評價。

          需要注意, Head First設(shè)計模式 是非常好的設(shè)計模式入門書,但千萬不要把這本書作為學(xué)習(xí)設(shè)計模式的唯一的書——是的,Head First 設(shè)計模式擁有風(fēng)趣的語言和詼諧的例子,但它既缺乏實際的工程范例,也沒有給出設(shè)計模式的應(yīng)用/適用場景。我個人建議是在讀過這本書之后立即閱讀 “四人幫” )的 設(shè)計模式 或 Bob 大叔 的 敏捷軟件開發(fā) ,以便理解設(shè)計模式在實際中的應(yīng)用。

          設(shè)計模式

          設(shè)計模式作為設(shè)計模式領(lǐng)域的開山之作,Erich Gamma,Richard Helm,Ralph Johnson等四位作者將各個領(lǐng)域面向?qū)ο蟪绦蜷_發(fā)的經(jīng)驗總結(jié)成三大類23種模式,并給出了每個模式的使用場景,變體,不足,以及如何克服這些不足。這本書行文嚴謹緊湊(四位作者都是PhD),并且代碼源自實際項目,屬于設(shè)計模式領(lǐng)域的必讀之作。

          需要注意: 設(shè)計模式不適合初學(xué)者閱讀——它更像是一篇博士論文而非技術(shù)書籍,加上它的范例都具有很強的領(lǐng)域背景(諸如 GUI 窗口系統(tǒng)和富文本編輯器),缺乏實際經(jīng)驗的程序員很難理解這本書。

          3. 重構(gòu)

          重構(gòu)

          任何產(chǎn)品代碼都不是一蹴而就,而是在反復(fù)不斷的修改中進化而來。 重構(gòu)這本書正是這樣一本介紹如何改進代碼的書籍——如何在保持代碼行為的基礎(chǔ)上,提升代碼的質(zhì)量(這也是重構(gòu)的定義)。

          我見過很多程序員,他們經(jīng)常聲稱自己在重構(gòu)代碼,但他們實際只做了第二步(提升代碼的質(zhì)量),卻沒有保證第一步(保持代碼行為),因此他們所謂的重構(gòu)往往會適得其反——破壞現(xiàn)有代碼或是引入新bug。這也是我推薦重構(gòu)這本書的原因——它既介紹糟糕代碼的特征(Bad smell)和改進代碼的方法,也給出了重構(gòu)的完整流程——1. 編寫單元測試保持(Preserve)程序行為;2. 重構(gòu)代碼;3. 保證單元測試通過。 重構(gòu) 還引入了一套重構(gòu)術(shù)語(諸如封裝字段,內(nèi)聯(lián)方法,和字段上移),以便程序員之間交流。只有理解了這三個方面,才能算是理解重構(gòu)。

          修改代碼的藝術(shù)

          這里再重復(fù)一遍重構(gòu)的定義——在保持代碼行為的基礎(chǔ)上,提升代碼的質(zhì)量。 重構(gòu) 專注于第二步,即如何提升代碼的質(zhì)量,而修改代碼的藝術(shù)專注于第一步,即如何保持代碼的行為。

          提升代碼質(zhì)量并不困難,但保持代碼行為就難多了,尤其是對沒有測試的遺留代碼(Legacy Code)而言——你需要首先引入測試,但遺留代碼往往可測試性(Testability)很差,這時你就需要把代碼變的可測試。修改代碼的藝術(shù)包含大量的實用建議,用來把代碼變的可測試(Testable),從而使重構(gòu)變?yōu)榭赡埽固岣叽a質(zhì)量變?yōu)榭赡堋?/p>

          4. 軟件測試

          How to Break Software

          關(guān)于軟件測試的書籍很多,但很少有一本測試書籍能像How to Break Software這般既有趣又實用。不同于傳統(tǒng)的軟件測試書籍(往往空話連篇,無法直接應(yīng)用), How to Break Software這本書非常實際——它從程序員的心理出發(fā),分析軟件錯誤/Bug最可能產(chǎn)生的路徑,然后針對這些路徑進行殘酷的測試,以保證軟件質(zhì)量。

          我在第一次閱讀這本書時大呼作者太過“殘忍”——連這些刁鉆詭異的測試招數(shù)都能想出來。但這種毫不留情(Relentless)的測試風(fēng)格正是每個專業(yè)程序員所應(yīng)具備的心態(tài)。

          注意:如果你是一個測試工程師,那么在閱讀這本書前請三思——因為閱讀它之后你會讓你身邊的程序員苦不堪言,甚至連掐死你的心都有 。

          xUnit Test Patterns

          How to Break Software 注重黑盒測試,而這本 xUnit Test Patterns 則注重白盒測試。正如書名所示, xUnit Test Patterns 覆蓋了單元測試的每個方面:從如何編寫良好的單元測試,到如何設(shè)計可測試(Testable)的軟件,再到如何重構(gòu)測試——可以把它看作為單元測試的百科全書。

          5. 項目管理

          極客與團隊

          很多程序員都向往成為橫掃千軍(One-man Army)式的“編程英雄”,但卓越的軟件并非一人之力,而是由團隊合力而成。

          極客與團隊就是這樣一本寫給程序員的如何在團隊中工作的絕好書籍,它圍繞著 HRT 三大原則(Humility 謙遜,Respect 尊重,和Trust信任),系統(tǒng)的介紹了如何融入團隊,如何打造優(yōu)秀的團隊,如何領(lǐng)導(dǎo)團隊,以及如何應(yīng)對團隊中的害群之馬(Poisonous People)。這本書實用性極強,以至于 Python 之父 Guido van Rossum 都盛贊這本書 “說出了我一直在做但總結(jié)不出來的東西”

          人月神話

          盡管人月神話成書于40年前,但它仍是軟件項目管理重要的書籍。人月神話 源自作者Fred Brooks領(lǐng)導(dǎo)并完成System/360和OS/360這兩個即是放到現(xiàn)在也是巨型軟件項目的里程碑項目的經(jīng)驗總結(jié)。它覆蓋了軟件項目各個方面的關(guān)鍵概念:從工期管理( Brooks定律 )到團隊建設(shè)( 外科團隊 ),從程序設(shè)計(編程的本質(zhì)是使用正確的數(shù)據(jù)結(jié)構(gòu))到架構(gòu)設(shè)計( 概念完整性 ),從原型設(shè)計(Plan to Throw one away)到團隊交流(形式化文檔+會議)。令人驚訝的是,即便40年之后,人月神話這本書中的關(guān)鍵概念(包括焦油坑,Brooks定律,概念完整性,外科團隊,第二版效應(yīng)等等)依然適用,而軟件開發(fā)的核心復(fù)雜度仍然沒有得到解決(沒有銀彈 )。

          6. 專業(yè)開發(fā)

          程序員修煉之道

          不要被庸俗的譯名迷惑,程序員修煉之道是一本價值極高的程序員成長手冊。

          這本書并不局限于特定的編程語言或框架,而是提出了一套切實可行的實效(Pragmatic)開發(fā)哲學(xué),并通過程序設(shè)計,測試,編程工具,以及項目管理等方面的實例展示了如何應(yīng)用這套開發(fā)哲學(xué),從而使得程序員更加高效專業(yè)。有人把這本書稱之為迷你版 代碼大全 —— 代碼大全給出了大量的優(yōu)秀程序設(shè)計實踐,偏向術(shù);而程序員修煉之道給出了程序設(shè)計實踐背后的思想,注重道。

          程序員職業(yè)素養(yǎng)

          程序員修煉之道指出了如何成為專業(yè)程序員,這本程序員職業(yè)素養(yǎng)則指出了專業(yè)程序員應(yīng)該是什么樣子——承擔(dān)責(zé)任;知道自己在做什么;知道何時說不/何時說是;在正確的時間編寫正確的代碼;懂得自我時間管理和工期預(yù)估;知道如何應(yīng)對壓力。如果你想成為專業(yè)程序員(Professional Developer)(而不是碼農(nóng)(Code Monkey),這本書會為你指明前進的方向。

          7. 大師之言

          奇思妙想

          奇思妙想:15 位計算機天才及其重大發(fā)現(xiàn) 是一本極具眼光的技術(shù)訪談書籍——在這本書訪談的 15 位計算機科學(xué)家中,竟出現(xiàn)了 12 位 圖靈獎 獲得者——要知道圖靈獎從 1966 年設(shè)獎到現(xiàn)在也只有六十幾位獲獎?wù)叨选?/p>

          奇思妙想把計算機科學(xué)分為四大領(lǐng)域:編程語言;算法;架構(gòu);人工智能。并選取了每個領(lǐng)域下最具代表性的計算機科學(xué)家進行訪談。因為這些計算機科學(xué)家都是其所在領(lǐng)域的開拓者,因此他們能給出常人無法給出的深刻見解。通過這本書,你可以了解前三十年的計算機科學(xué)的發(fā)展歷程——計算機科學(xué)家做了什么,而計算機又能做到/做不到什么。從而避免把時間浪費在前人已經(jīng)解決的問題(或者根本無法解決的問題)上面。

          編程人生

          同樣是訪談錄,同樣訪談 15 個人, 編程人生把重點放在程序員(Coders at work)上。它從各個領(lǐng)域選取了15位頂尖的程序員,這些程序員既包括 Ken Thompson 和 Jamie Zawinski 這些老牌Unix黑客,也包括 Brad Fitzpatrick 這樣的80后新生代,還包括 Frances Allen 和 Donald Knuth 這樣的計算機科學(xué)家。這種多樣性(Diversity)使得 編程人生 兼具嚴謹性和趣味性,無論你是什么類型的程序員,都能從中受益良多。

          8. 界面設(shè)計

          寫給大家看的設(shè)計書

          書如其名, 寫給大家看的設(shè)計書是一本面向初學(xué)者的快速設(shè)計入門。它覆蓋了版式,色彩,和字體這三個設(shè)計中的關(guān)鍵元素,并創(chuàng)造性的為版式設(shè)計總結(jié)出CRAP四大原則(Contrast 對比,Repetition 重復(fù),Alignment 對齊,Proximity 親密)。全書使用豐富生動的范例告訴讀者什么是好的設(shè)計,什么是不好的設(shè)計,使得即便是對設(shè)計一無所知的人,也可以從這本書快速入門。

          認知與設(shè)計

          寫給大家看的設(shè)計書強調(diào)實踐,即如何做出好的設(shè)計; 認知與設(shè)計:理解 UI 設(shè)計準則 強調(diào)理論,即為什么我們會接受這樣的設(shè)計而反感那樣的設(shè)計。如果你想要搞清楚設(shè)計背后的心理學(xué)知識,但又不想閱讀大部頭的心理學(xué)著作,那么 認知與設(shè)計是你的首選。

          9. 交互設(shè)計

          通用設(shè)計法則

          書如其名, 通用設(shè)計法則給出了重要的 125 個設(shè)計原則,并用簡練的語言和范例展示了這些原則的實際應(yīng)用。每個原則都有對應(yīng)的參考文獻,以便讀者進一步學(xué)習(xí)。我之所以推薦這本書,是因為:1. 程序員需要對設(shè)計有全面的認識;2. 程序員并不需要知道這些設(shè)計原則是怎么來的,知道怎么用即可。這本書很好的滿足了這兩個要求。

          交互設(shè)計精髓

          交互設(shè)計精髓這本書是交互設(shè)計領(lǐng)域的圣經(jīng)級著作。交互設(shè)計專家(以及 VB 之父) Alan Cooper 在這本書中詳細介紹了交互設(shè)計的原則,流程,以及方法,然后通過各種范例(主要來自桌面系統(tǒng))展示了如何應(yīng)用這些原則。

          需要注意的是這本書的 第 4 版 已經(jīng)出版,它在第三版的基礎(chǔ)上增加了移動設(shè)計以及 Web 設(shè)計等內(nèi)容。

          個人成長

          1. 職業(yè)規(guī)劃

          軟件開發(fā)者路線圖

          軟件開發(fā)者路線圖是一本優(yōu)秀且實用的程序員職業(yè)規(guī)劃手冊。這本書由若干個模式組成,每個模式都對應(yīng)于程序員職業(yè)生涯中的特定階段。通過這本書,讀者可以很方便的找到自己目前所處的模式(階段),應(yīng)該做什么,目標是什么,以及下一個模式(階段)會是什么。如果你時常感到迷茫,那么請閱讀這本 路線圖 ,找到自己的位置,確定接下來的方向。

          2. 思維方式


          程序員的思維修煉

          作為程序員,我們需要不斷地學(xué)習(xí)——既要學(xué)習(xí)新技術(shù),也要學(xué)習(xí)如何解決各種領(lǐng)域的問題。為了提升學(xué)習(xí)效率,我們需要學(xué)習(xí)如何學(xué)習(xí)。 程序員的思維修煉 正是這樣一本講如何學(xué)習(xí)的書,它集合了認知科學(xué),神經(jīng)學(xué),以及行為理論的最新研究成果,并系統(tǒng)的介紹了大腦的工作機制。通過這本書,你將學(xué)會如何高效的使用自己的大腦,從而提高思考能力,改善學(xué)習(xí)效率。


          Mastery is not about perfection. It’s about a process, a journey. The master is the one who stays on the path day after day, year after year. The master is the one who is willing to try, and fail, and try again, for as long as he or she lives.

          為什么同樣資質(zhì)的人,大多數(shù)人會碌碌無為,而只有極少數(shù)能做到登峰造極?如何在領(lǐng)域內(nèi)做到頂尖?如何克服通往頂尖之路上的重重險阻? 如何把事情做到最好回答了這些問題,并極具哲理的指出登峰造極并不是結(jié)果,而是一段永不停止的旅程。閱讀這本書不會讓你立刻脫胎換骨,但它會指引你走向正確的道路——通往登峰造極之路。

          3. 求職面試

          金領(lǐng)簡歷

          知己知彼,百戰(zhàn)不殆。 金領(lǐng)簡歷:敲開蘋果微軟谷歌的大門是程序員求職的必讀書籍,它覆蓋了程序員求職的方方面面:從開始準備到編寫簡歷,從技術(shù)面試到薪酬談判。由于該書作者曾在 Google,微軟,和蘋果任職并進行過技術(shù)招聘,因此這本書的內(nèi)容非常實用。

          順便吐個槽:這本書翻譯的還不錯,但我實在無法理解封面上的“進入頂級科技公司的葵花寶典”這段文字——找個工作而已,用不著這么兇殘吧。

          程序員面試金典

          同樣是來自金領(lǐng)簡歷作者的作品, 程序員面試金典(第 5 版) 專注于技術(shù)面試題,它既包含了 IT 企業(yè)(諸如微軟,Google,和蘋果)的面試流程以及如何準備技術(shù)面試,也包含了大量(超過200道)常見技術(shù)面試題題目以及解題思路。無論你打算進入國內(nèi)企業(yè)還是外企,你都應(yīng)該把這本書的題目練一遍,以找到技術(shù)面試的感覺(我在求職時就曾經(jīng)專門搞了一塊白板,然后每二十分鐘一道題的練習(xí),效果很不錯)。

          4. 英語寫作

          詞匯量決定閱讀能力,語法決定寫作能力。計算機專業(yè)詞匯并不多,但精確性非常重要,因此每個程序員都應(yīng)具備良好的英語語法,但程序員并不需要過于專業(yè)的英語語法——掌握常用語法并把它用對就可以。 The Only Grammar Book You’ll Ever Need 正好可以滿足這個需求,盡管它篇幅不大(不足 200 頁),卻覆蓋了英語中的關(guān)鍵語法以及常見錯誤。把這本書讀兩遍,它會大幅度提高你的英語寫作能力。

          既是最暢銷的英語寫作書籍,也是計算機書籍中引用最多的非計算機書籍。 風(fēng)格的要素用極其簡練的語言講述了如何進行 嚴肅精確清楚的英語寫作。從這本書中,你不僅可以學(xué)到英語寫作,更可以學(xué)到一種嚴謹至簡的處事態(tài)度,而這正是專業(yè)開發(fā)所必需的。

          以上書單覆蓋了軟件開發(fā)各個關(guān)鍵領(lǐng)域的入門書籍和必讀書籍,它可以滿足絕大多數(shù)程序員的需求,無論你是初學(xué)者,還是進階者,都可以從中獲益。


          主站蜘蛛池模板: 视频在线一区二区三区| 无码人妻精品一区二区三区9厂| 卡通动漫中文字幕第一区| 亚洲欧美日韩中文字幕一区二区三区 | 精品国产AⅤ一区二区三区4区| 亚洲中文字幕在线无码一区二区| 精品免费久久久久国产一区| 精品国产aⅴ无码一区二区| 国产AV午夜精品一区二区入口| 欲色影视天天一区二区三区色香欲| 亚洲国产激情在线一区| 久久亚洲综合色一区二区三区| 久久精品中文字幕一区| 立川理惠在线播放一区| 国产精品久久久久一区二区| 国产一区二区三区乱码在线观看| 人妻无码第一区二区三区| 亚洲AV午夜福利精品一区二区| 精品乱人伦一区二区三区| 伦理一区二区三区| 亚洲一区精品无码| 国产精品毛片一区二区三区| 久久一本一区二区三区| 国产午夜精品一区二区三区| 夜夜添无码试看一区二区三区| 国产一区二区三区不卡AV| 亚洲综合国产一区二区三区| 国产AV午夜精品一区二区入口| 亚洲国产日韩一区高清在线| 亚洲AV本道一区二区三区四区| 欧洲无码一区二区三区在线观看| 亚洲一区精品中文字幕| 久久精品国产一区二区三| 人妻少妇精品视频一区二区三区| 亚洲福利一区二区精品秒拍| 无码国产精品一区二区免费式影视| 亚洲欧美日韩中文字幕在线一区| 国产一区在线播放| 久久久久人妻精品一区三寸蜜桃| 精品视频一区二区| 美女视频一区二区三区|