整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

电脑基础知识教程-弈安教你认识ActiveX技术

文结合目前Internet(WEB)技术发展动向,简略介绍了Microsoft提出的ActiveX技术的内容,阐述了ActiveX技术与WEB 站点建设和桌面程序开发的关系,以及利用Visual C++和Visual Basic开发ActiveX部件的步骤和方法,并给出了在WEB网页中使用ActiveX部件的例子。

1. ActiveX概要

1.1. ActiveX的定义

ActiveX是Microsoft提出的一组使用COM(Component Object Model,部件对象模型)使得软件部件在网络环境中进行交互的技术集。它与具体的编程语言无关。作为针对Internet应用开发的技术,ActiveX被广泛应用于WEB服务器以及客户端的各个方面。同时,ActiveX技术也被用于方便地创建普通的桌面应用程序。

1.2. ActiveX的内容

ActiveX既包含服务器端技术,也包含客户端技术。其主要内容是:

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

ActiveX文档(ActiveX Document);用于在WEB Browser或者其它支持ActiveX的容器中浏览复合文档(非HTML文档),例如Microsoft Word文档,Microsoft Excel文档或者用户自定义的文档等。

ActiveX脚本描述(ActiveX Scripting);用于从客户端或者服务器端操纵ActiveX控制和Java程序,传递数据,协调它们之间的操作。

ActiveX服务器框架(ActiveX Server Framework);提供了一系列针对WEB服务器应用程序设计各个方面的函数及其封装类,诸如服务器过滤器、HTML数据流控制等。

在Internet Explorer中内置Java虚拟机(Java Virtual Machine),从而使Java Applet能够在Internet Explorer上运行,并可以与ActiveX控制通过脚本描述语言进行通信。

1.3. ActiveX与Java的比较

ActiveX提供了一种扩展包括Java在内的任何编程语言的机制,Java的开发人员可以在Applet中使用ActiveX技术,直接嵌入 ActiveX控制,或者以ActiveX技术为桥梁,将其它开发商提供的多种语言的程序对象集成到Java中。与Java的字节码技术相比, ActiveX提供了“代码签名”(Code Signing)技术保证其安全性。

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规范的容器中,或者作为Internet控制嵌入到WEB页面中。用户访问该页面时将下载该控制并自动在本地注册。利用脚本描述语言(Script)可以在控制之间以及客户与服务器之间通过设置属性(Property)、调用方法(Method)和激活事件(Event)进行通信。

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

目前,很多第三方开发商编制了各式各样的ActiveX控制。在Internet上,有超过1000个ActiveX控制供用户下载使用。在 WINDOWS的SYSTEM目录下,保存有很多Window提供的ActiveX控制。Microsoft Visual C++(以下简称VC)提供的MFC(Microsoft Foundation Classes)控制都是ActiveX控制。

考虑到当前Internet相对较低的传输速率,设计运行于Internet的ActiveX控制时,必须考虑以下几个问题:

控制尽可能小;

持续存储数据(Persist Data)如何保存;

如何在Internet上下载和安装;

控制如何在客户端注册;

3. ActiveX文档和Internet

ActiveX文档提供了传统的嵌入对象的扩展方法。ActiveX文档对象可以包含多个页,显示在整个客户区中,并支持原有的菜单功能。与以往的嵌入对象不同的是,ActiveX文档对象不再以一个阴影方框包围来显示,而是全框架(Full Frame),并总处于激活状态。

Microsoft Office97提供了Microsoft Office Binder,用来生成并浏览由Microsoft Word、 Microsoft Excel或者用户定义的ActiveX文档等构成的复合文档,每一种文档类型都可以直接进行编辑修改。 ActiveX文档可以作为对象嵌入到WEB网页中,在WEB上发布。

4. ActiveX脚本描述语言

利用VBScript或者Microsoft JScript,可以向Web页面中加入可用于交互的ActiveX控制,将数据预处理或者检验过程放在客户端进行,然后将结果传往WEB服务器。

5. ActiveX服务器框架

在WEB服务器上创建扩展应用程序,动态生成WEB页面。使用MFC提供的ISAPI类可以方便地建立WEB服务器端的扩展应用程序。

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

VC++ 5.0(企业版)为Internet开发提供了完整的解决发案,其内容是:

使用MFC或者ATL开发ActiveX控制和ActiveX文档。

使用ISAPI设计WEB服务器端的部件。

使用WinInet 开发通过Internet存取文件的应用程序。

使用Asynchronous Monikers生成从Internet下载数据的应用程序。

使用ActiveX SDK开发其它类型的基于Internet的Win32应用程序,包括ActiveX Scripting Host,Microsoft WebConferencing等。

6.1. 用VC5.0开发ActiveX控制

VC++5.0提供两个途径开发ActiveX控制:MFC和ATL(Active Template Library)。使用MFC,可以不必理会控制接口的细节,把注意力集中在控制本身的功用上,但是生成的控制比较大。而且,客户端如果要运行此ActiveX控制,必须拥有相应版本的MFC类库的 DLL,否则,必须同时下载这些巨大的类库;使用ATL,由于不涉及MFC的标准类库,生成的控制相对较小,但开发者必须了解COM、OLE技术的细节。大多数情况下,可以使用MFC开发ActiveX控制,这样比较容易。而且,由于Internet Explorer 3.0提供了MFC 4.1的类库,而Internet Explorer 3.0是Windows95提供的组件,所以,只要ActiveX控制使用的是MFC 4.1或者更早的版本,多数情况下不需要下载MFC的类库。

使用MFC开发ActiveX控制,可以用MFC ActiveX Control Wizard生成工程框架。VC会自动产生三个类:(假设MyName是控制的名字。)

CMyNameApp:从类COleControlModule派生,而类COleControlModule则派生自CWinApp;

CMyNameCtrl:从类COleControl派生,而类COleControl则派生自CWnd;

CMyNamePropPage:从类COlePropertyPage派生,而类COlePropPage则派生自CDialog;

可以看出,这个框架与一般的MFC应用程序有些类似。开发人员的大部分工作在CMyNameCtrl中,例如用Class Wizard添加属性、方法和事件,处理显示等。

编译生成OCX文件后,用VC提供的ActiveX Test Container测试这个控制,也可以用OLE/COM Object Viewer浏览此控制的接口信息及类型库。

6.2. ActiveX控制在WEB上的应用

考虑到WEB的安全性,为了在服务器与客户端建立良好的信任关系,必须为每个在WEB上使用ActiveX控制设置一个“代码签名” (Code Signing)。VC5.0提供了生成供测试用的“代码签名”的工具。如果要正式发布,则必须向有关机构申请。(参见http: //www.microsoft.com/intdev/signcode/)

在WEB页面中使用ActiveX控制,还要对之进行包装,将有关的动态连接库及信息文件压缩到一个扩展名为CAB(Cabinet)文件中。可以使用VC5.0提供的工具包装ActiveX控制。在HTML文件中,使用OBJECT标签插入ActiveX控制,并利用VBScript或者 JScript访问该ActiveX控制。客户端用Internet Explorer浏览此页面时,可以自动解包该文件。出于安全性的考虑, Internet Explorer为ActiveX 部件的下载、初始化、是否拥有合法的代码签名以及是否允许Scripting等设置了不同的安全级别,用户可根据需要进行设置。下面这个例子中,使用了ActiveX控制“MSChart.OCX",当用鼠标单击此控制时,控制的标题将改变。

ID=chart1 WIDTH=400 HEIGHT=200

ALIGN=center>

其中,Object ID是这个ActiveX DLL中某个类的名字。当此WEB页面被下载并显示时,MyClass类的方法LogIn将被调用,并在客户端显示LogIn对话框。

7.3. Visual Basic 6.0

Microsoft计划于1998年9月推出Visual Basic 6.0。目前Beta版正在测试。VB 6.0与VB5.0相比,除继续支持 Internet Explorer Document Object Model(DOM)开发之外,将提供两个令人兴奋的新功能:

Dynamic HTML编辑器

开发人员可以象编制普通VB程序一样,制作DHTML文件或模板。

WebClasses;

开发人员可以在WEB服务器端建立与ASP文件一一对应的WebClass类,每个类都可以访问ASP对象,在Visual Basic IDE中跟踪调试,并生成 ISAPI 动态连接库。

8. 小结

正如Internet和WEB技术一样,ActiveX技术的发展日新月异,新的更强大的开发工具使得服务器及客户端的应用开发、网站建设变得更简单,并容易扩展和重用。随着Microsoft的包括Windows NT、Internet Information Server、 Active Server Pages以及Microsoft FrontPage、Internet Explorer等组件在内完整的 Internet解决方案被广泛使用,ActiveX技术将会有更大的发展。

参考文献:

1. Visual C++技术内幕(第二版),[美]David J. Kruglinski著,王国印译,清华大学出版社。

2. ActiveX开发人员指南,[美]Eric Tall,Mark Ginsburg著,章巍等译,机械工业出版社。

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等技术资源。

8. http://www.ActiveX.com,第三方开发的ActiveX控制。

9. http://www.Active-X.com,有关ActiveX技术的文档资料。

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

弈安传媒科技微课堂,每天分享财经资讯,计算机技术知识,人生感悟,创业指导以及各种专业技术知识资料学习交流.移动学习平台、知识分享平台。随时随地的学习,如果你喜欢成长,这里你不容错过的地方.弈安传媒科技培训关注:关注自己成长,分享内容,分享自己的技术,成就未来.

[弈安传媒科技提升自己的平台]请关注:头条号及公众号 弈安传媒科技

WPF 或 WinForms 应用程序选择浏览器组件,对于那些搜索基于Chrome的解决方案的人来说, DotNetBrowser[1]CefSharp[2]是最明显的选择。

本文是我们的客户在考虑其项目的开源库和商业库时提出的最常见比较点的汇编。

引擎

CefSharp 实际上是 Chromium Embedded Framework[3] (CEF) 的 .NET 包装器。包装通过 C++/CLI 完成。

DotNetBrowser 在底层不使用 CEF 或 C++/CLI。相反,它采用了自己的方法直接与 Chromium 集成。它启动一个功能齐全的 Chromium 引擎,并通过进程间通信 (IPC) 与其进行通信。

架构

在 CefSharp 中,Chromium 引擎直接在您的 .NET 进程中初始化[4]。初始化和关闭都必须在主应用程序线程(通常是 UI 线程)中执行。在不同的线程中调用它们通常会导致冻结。

此外,每个进程可以执行一次初始化和关闭。这个限制来自 CEF 本身。在执行关闭后尝试重新初始化 CefSharp 将导致错误。

CefSharp architecture

在 DotNetBrowser 中,Chromium 引擎在单独的本机进程中进行初始化。不需要在主 UI 线程上执行此操作——即使在工作线程中也可以执行此操作。

您可以同时初始化和使用具有不同配置的多个 Chromium 引擎,这在 CefSharp 中是不可能的。您可以在不再需要 Chromium 时将其关闭并随时重新初始化。

DotNetBrowser architecture

稳定性和内存使用

在单独的进程中运行 Chromium 有更多优点:

  1. 在这种情况下,内存消耗要低得多,这对于 32 位应用程序来说似乎很关键。
  2. 在 CefSharp 中,如果 CEF 或 C++/CLI 绑定内部出现问题,这将导致整个 .NET 应用程序崩溃而无法处理这种情况。这就不太妙了,因为 .NET 应用程序可能会丢失或损坏用户的数据。

对于 DotNetBrowser,Chromium 内部的错误不会导致 .NET 应用程序崩溃。此外,甚至可以在托管代码中正确检测和处理这一切。例如,如果发生这种情况,那么您可以重新初始化 Chromium 并恢复用户会话。

应用程序域

由于其架构,CefSharp 不能在非默认 AppDomain 中使用[5]。因此,它不能用于通过 VSTO 插件或 Excel-DNA 将 Chromium 嵌入到 Office 应用程序中[6]。Office VSTO 将加载项加载到单独的 AppDomain 中以进行隔离。DotNetBrowser 在非默认 AppDomain 中运行。事实上,可以在不同的 AppDomain 中创建多个 Chromium 引擎并同时使用它们。因此,DotNetBrowser 可用于创建 VSTO 加载项。

AnyCPU

在针对 AnyCPU 的应用程序中使用 CefSharp 时,您会发现它在这些应用程序的 64 位环境中无法正常工作。

这儿有几个选项[7]可以解决这个问题。其中之一是让您的应用程序始终在 32 位模式下运行,另一个更复杂,需要修改项目文件(.csproj.vbproj)和代码。

在 DotNetBrowser 中,AnyCPU 支持开箱即用。因此,不需要类似的调整。

H.264, AAC

视频和音频通常使用专有编解码器进行编码,例如 H.264 和 AAC。此媒体无法在 CefSharp 中播放。

要在 CefSharp 中启用这些编解码器,您需要在启用专有编解码器的情况下自行重建 CEF。这是一项相当复杂的任务,可能需要长达一个月的时间[8]

在 DotNetBrowser 中默认禁用专有编解码器。可以通过编程方式启用它们,而无需重建库:

InitializeCodecs.cs

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

安全

Chromium 通过利用操作系统为它们提供的安全性来限制其渲染器和实用程序进程。此功能称为 Chromium沙箱[9]。其主要目的是防止第三方代码对计算机进行持久更改或访问机密信息。

CefSharp 不支持 Chromium 沙箱[10]。这个限制来自 CEF 本身。

DotNetBrowser 支持沙箱并默认启用。如有必要,可以在初始化期间将其禁用[11]

CefSharp 在 .NET 进程中启动 Chromium。这使您的应用程序容易受到 CEF 和 Chromium 中的漏洞的影响。如果恶意软件获得了对 Chromium 内存的访问权,它也会获得对 .NET 内存的访问权。

DotNetBrowser 在单独的进程中启动 Chromium。

Chromium 漏洞保留在 Chromium 中。

Visual Studio设计器

现代 WPF 和 Windows 窗体应用程序通常是在设计器的帮助下在 Visual Studio 中创建的。这种方法总体上简化了 UI 创建并节省了大量时间和精力。

CefSharp 提供有限的设计器支持[12]。如果应用程序本身以 x86 为目标,则其控件将在设计器中正确处理。AnyCPU 可能会工作,但尚未经过彻底测试。

DotNetBrowser 控件是纯 UI 控件,它们在代码中显式初始化。您可以在设计器中不受任何限制地使用它们。安装 NuGet 包或 VSIX 扩展后,BrowserView 控件出现在工具箱中。它可以像任何其他常规 UI 控件一样被拖到窗体或窗口上。

嵌入应用程序 UI

CefSharp 提供 WPF 和 Windows 窗体支持。但是,它的 WPF 实现只能在离屏渲染模式[13]下工作。此实现具有有限的触摸屏和 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 初始化和关闭是隐式执行的,很难确定它是否已经在某个点初始化。

将 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 实例的显式初始化和关闭有关。UI 控件初始化是通过调用 InitializeFrom() 显式执行的。这种方法可以更好地控制初始化和关闭过程,并且更容易自定义初始 Chromium 配置。

高DPI

在 CefSharp 中,浏览器子进程的 默认 DPI 感知[16] 是 Per-Monitor。因此,桌面应用程序应具备 DPI 感知功能,才能在高 DPI 显示器(DPI 比例设置大于 100% 的显示器)上正确运行。在其他情况下,浏览器内容可能无法正确呈现,例如:

DotNetBrowser 以不同的方式支持高 DPI。在初始化过程中,它会检查当前进程的 DPI 感知,并为相应的 Chromium 引擎设置匹配的 DPI 感知。因此,无需让您的应用程序显式识别 DPI 以避免在高 DPI 显示上呈现伪影。

Headless

DotNetBrowser 和 CefSharp 都可以在没有 UI 的应用程序中使用。

在 CefSharp 中,CefSharp.OffScreen.ChromiumWebBrowser 用于此目的。初始化过程通常保持不变。但是,如果您的代码使用 async/await 模式,则需要使用同步上下文来确保在主线程上而不是在不同的工作线程上执行初始化和关闭。

要在没有 UI 的应用程序中使用 DotNetBrowser,您需要像往常一样执行初始化。在这种情况下,没有需要初始化的 BrowserView。即使您的代码使用async/await模式,也无需创建和使用同步上下文。

API和功能

这两种产品都有许多可用的功能。在本文中,我将比较几个最重要的,以展示 API 的不同之处。

DOM访问

在 CefSharp 中,您只能通过执行 JavaScript 调用来访问 DOM。

例如:

CefSharpDom.cs

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

DotNetBrowser 提供了丰富的 DOM API,可用于直接从 .NET 执行以下操作:

  • 访问和修改 DOM 树;
  • 更改 HTML 元素属性;
  • 订阅 DOM 事件并从 .NET 代码中调度它们。

例如,以下是如何在 DotNetBrowser 中的网页上执行相同的操作:

DotNetBrowserDom.cs

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

因此,在 DotNetBrowser 中与网页执行复杂的交互要方便得多。无需编写难以调试和支持的复杂 JavaScript 代码。DotNetBrowser 中的 DOM API 不是一组 JavaScript 调用的包装器。它直接对 Blink 引擎进行 IPC 调用。

与JavaScript交互

执行JavaScript并处理结果

CefSharp 和 DotNetBrowser 都提供了在网页上执行 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 获取执行结果。

可能的结果类型有 bool, int, long, double, string, List<object>``, IDictionary<string, object>``, 和 IJavascriptCallback。这里的集合是 JavaScript 集合的快照表示,而 IJavascriptCallback 是一种 JavaScript 函数表示,可用于从 .NET 端执行它。

在 DotNetBrowser 中,有 IFrame.ExecuteJavaScript() 用于此目的。此方法的通用版本可用于显式指定预期的返回类型:

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");

这里的主要区别是可以将 JavaScript 对象表示为IJsObject。使用此接口,您可以访问和修改 JavaScript 对象的属性并调用其方法。在 .NET 端对 IJsObject 所做的所有更改都将立即反映在 JavaScript 端。此外, ExecuteJavaScript 调用可以返回一个 IElement,这是一个 DOM 元素的表示,您可以使用它来访问和修改 DOM 属性或订阅 DOM 事件。

从JavaScript调用.NET

CefSharp 和 DotNetBrowser 都可以使网页上的 JavaScript 可以访问 .NET 对象,但是,CefSharp 存在一些特定的限制。

CefSharp JavaScript 绑定可用于 JavaScript 和 .NET 之间的通信。但是,CefSharp 不允许[17]将Form, Window 或任何Control注入 JavaScript。另外,CefSharp 只支持调用注入对象的方法。如果需要设置属性,则必须修改类并创建 Get/Set 方法。

在 DotNetBrowser 中,您可以将任何对象注入 JavaScript,包括 Form, Window 和 Control 对象。执行注入后,您可以访问注入的 .NET 对象的公共字段、属性和方法。此外,DotNetBrowser 支持从 JavaScript 访问索引属性(使用字符串或数字索引器)。如果您需要从 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 中提供的扩展方法将此类型转换为常规 System.Drawing.Bitmap。

分发和部署

CefSharp 需要 Microsoft Visual C++ 运行时存在于环境中[19]。Visual C++ 2015 是最低版本,但所需的确切版本取决于 Chromium 版本。因此,需要在您希望运行基于 CefSharp 的应用程序的每台机器上预安装 Microsoft Visual C++ Redistributable Package,将其设置为安装程序的依赖项,或将其 DLL 打包为应用程序的一部分,并确保 CefSharp 正确找到它们。

在 DotNetBrowser 中,所有必需的 Chromium 二进制文件和 DLL 都已打包到 DotNetBrowser DLL 中,并且可以在执行期间自动提取。您无需预先安装 Microsoft Visual C++ Runtime 即可使用 DotNetBrowser。

支持和更新

CefSharp 是一个开源项目。如果您发现错误或缺少功能,您可以提出建议[20]

DotNetBrowser是为使用.NET开发软件的商业公司设计和创建的商业产品,对集成第三方解决方案的质量和支持有很高的要求。自 2015 年以来,TeamDev 开发并支持 DotNetBrowser。

我们所有已订阅有效标准支持[21]的客户都可免费使用所有DotNetBrowser 新版本并获得技术支持。如果您发现错误或缺少功能,我们将应用修复程序,实施所需功能,并根据任务的复杂性在几天或几周内为您提供新版本的库。

几乎每个月都会发布一个新版本的 DotNetBrowser。我们会在 Chromium 正式发布后的 3-4 周内将 Chromium 升级到最新的稳定版本(带有最新的安全补丁和修复的漏洞)。

概括

因为开源和免费,CefSharp 被广泛使用。它很容易为基本案例进行配置,并且拥有广泛的文档和活跃的开源开发者社区。

但是,它具有来自其设计和架构的限制。缺少沙盒支持使其安全性降低,并且进程内方法会影响稳定性并增加应用程序的内存使用量。

它也不能用于暗示在单独的 AppDomain(如 VSTO)中运行代码的环境。对于其他一些情况,例如播放使用专有编解码器编码的内容,您必须自己构建、更新和维护 CEF。这需要大量额外的工作和基础设施。

与加载的网页的复杂交互会通过 JavaScript 注入执行,这使得生成的代码更难调试和支持。

DotNetBrowser 简化了所有这些案例的开发过程——由于它的进程外架构,它可以用于创建更稳定和安全的解决方案。使用 DotNetBrowser,您可以与需要在单独的 AppDomain 中运行代码的应用程序集成,并在网页上执行复杂的操作,而无需进行大量的 JavaScript 注入。

除此之外,如果您觉得缺少哪些功能、发现问题或有其他任何疑问,您可以随时与我们联系并获得帮助[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 应用程序中: 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]

提供有限的设计器支持: 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++ 运行时存在于环境中: 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]

联系并获得帮助: https://dotnetbrowser-support.teamdev.com/getting-help?utm_campaign=dotnetbrowser-articles&utm_medium=article&utm_source=medium

文把程序员所需掌握的关键知识总结为三大类19个关键概念,然后给出了掌握每个关键概念所需的入门书籍和必读书籍,旨在成为最好最全面的程序员必读书单,帮助广大IT人士实现自我提升。在书单中,我把程序员应掌握的关键概念分为程序设计,软件开发,以及个人成长三大类,每一大类均由若干关键概念组成。

程序设计

1. 基础理论

编码

编码:隐匿在计算机软硬件背后的语言,这本书其实不应该叫编码——它更应该叫“Petzold教你造计算机”——作者 Charles Petzold 创造性的以编码为主题,从电报机和手电筒讲到数字电路,然后利用数字电路中的逻辑门构造出加法器 和触发器,最后构造出一个完整的 存储程序计算机 。不要被这些电路概念吓到—— 编码使用大量形象贴切的类比简化了这些概念,使其成为最精彩最通俗易懂的计算机入门读物。

深入理解计算机系统

深入理解计算机系统(第2版) 这本书的全名是:Computer Systems:A Programmer’s Perspective,所以它又被称为 CSAPP。

深入理解计算机系统这本书是我读过的最优秀的计算机系统导论型作品,它创造性的把操作系统,计算机组成结构,数字电路,以及编译原理这些计算机基础学科中的核心概念汇集在一起,从而覆盖了指令集体系架构,汇编语言,代码优化,计算机存储体系架构,链接,装载,进程,以及虚拟内存这些程序员所需了解的关键计算机系统知识。如果想打下扎实的计算机基础又不想把操作系统计算机结构编译原理这些书统统读一遍,阅读 深入理解计算机系统是最有效率的方式。

2. 编程语言

编程语言是程序员必不可少的日常工具。工欲善其事,必先利其器。我在这里给出了 C,C++,Java,C#,JavaScript,和Python 这六种 常用编程语言的书单,我个人不熟悉 Objective-C 和PHP,因此它们不在其中。

需要注意的是:我在这里给出的是编程语言Programming Language书籍,而非编程平台Programming Platform书籍。以 Java 为例, Effective Java 属于编程语言书籍,而 Android编程权威指南 就属于编程平台书籍。

C

对于C语言初学者,最难的概念不仅仅是指针和数组,还有指向数组的指针和指向指针的指针。C和指针花了大量的篇幅和图示来把这些难懂但重要的概念讲的清清楚楚,这也是我推荐它作为C语言入门读物的原因。

C程序设计语言

尽管C程序设计语言这本书是二十多年前的书籍,但它仍然是C语言——以及计算机科学中最重要的书籍之一,它的重要性不仅仅在于它用清晰的语言和简练的代码描述了 C 语言全貌,而且在于它为之后的计算机书籍——尤其是编程语言书籍树立了新的标杆。

C++ 程序设计原理与实践

作为C++的发明者,没有人能比 Bjarne Stroustrup 更理解C++。Bjarne在Texas A&M大学任教时使用C++为大学新生讲授编程,从而就有了 C++ 程序设计原理与实践这本书——它面向编程初学者,既包含 C++ 教程,也包含大量程序设计原则。它不但是我读过最好的C++入门书,也是我读过最好的编程入门书。

比较有趣的是, C++ 程序设计原理与实践 直到全书过半都没有出现指针,我想这可能是Bjarne为了证明不学C也可以学好C++吧。

C++

同样是 Bjarne Stroustrup 的作品, C++ 程序设计语言 是 C++ 最权威且最全面 的书籍。第4版相对于之前的版本进行了全面的更新,覆盖了第二新的C++ 11标准,并砍掉了部分过时的内容。

Java

平心而论Java核心技术 (即Core Java)并不算是一本特别出色的书籍:示例代码不够严谨,充斥着很多与C/C++的比较,语言也不够简洁——问题在于Java并没有一本很出色的入门书籍,与同类型的Java编程思想 相比,Java核心技术 至少做到了废话不多,与时俱进(Java编程思想 还停留在 Java 6之前),矮子里面选将军,Java核心技术算不错了。

Effective Java

尽管Java没有什么出色的入门书籍,但这不代表 Java 没有出色的必读书籍。Effective Java是我读过的最好的编程书籍之一,它包含大量的优秀Java编程实践,并对泛型和并发这两个充满陷阱的Java特性给出了充满洞察力的建议,以至于Java之父 James Gosling为这本书作序:“我很希望 10 年前就拥有这本书。可能有人认为我不需要任何 Java 方面的书籍,但是我需要这本书。”

C#

C#的语言特性非常丰富,很难用简短的篇幅概括这些特性;

精通 C#之所以有近 1200 页的篇幅,是因为它不但全面介绍了 C# 语言,而且还覆盖了 ADO.NET,WCF,WF,WPF,以及 ASP.NET 这些 .Net 框架。你可以把这本书视为两本书——一本 500 多页的 C# 语言教程和一本 600 多页的 .Net 平台框架快速上手手册。

尽管标题带有“精通”两字, 精通 C# 实际上是一本面向初学者的C#书籍,你甚至不需要太多编程知识,就可以读懂它。

CLRviaC#

CLRviaC#是C#/.Net最重要的书籍,没有之一。它全面介绍了.Net 的基石—— CLR的运行原理,以及构建于CLR之上的 C# 类型系统,运行时关系,泛型,以及线程/并行等高级内容。任何一个以 C# 为工作内容的程序员都应该阅读此书。

JavaScript

尽管JavaScript现在可以做到客户端服务器端通吃,尽管 JQuery 之类的前端框架使得一些人可以不懂JavaScript也可以编程,但我还是认为学习JavaScript从HTML DOM开始最为适合,因为这是JavaScript设计的初衷。 JavaScript DOM编程艺术系统的介绍了如何使用JavaScript,HTML,以及 CSS 创建可用的 Web 页面,是一本前端入门佳作。

JavaScript语言

JavaScript语言包含大量的陷阱和误区,但它却又有一些相当不错的特性,这也是为什么 Douglas Crockford 称JavaScript为 世界上最被误解的语言 ,并编写了 JavaScript 语言精粹 一书来帮助前端开发者绕开JavaScript中的陷阱。和同类书籍不同, JavaScript 语言精粹 用精炼的语言讲解了JavaScript语言中好的那部分(例如闭包,函数是头等对象,以及对象字面量),并建议读者 不要 使用其它不好的部分(例如混乱的类型转换,默认全局命名空间,以及 奇葩的相等判断符 ),毕竟,用糟糕的特性编写出来的程序往往也是糟糕的。

Python

Python 的入门书籍很多,而且据说质量大多不错,我推荐 Python 基础教程 的原因是因为它是我的Python入门读物——简洁,全面,代码质量很不错,而且有几个很有趣的课后作业,使得我可以快速上手。

这里顺便多说一句,不要用 Python 学习手册 作为Python入门——它的废话实在太多,你能想象它用了15页的篇幅去讲解if语句吗?尽管 O’Reilly 出了很多经典编程书,但这本 Python 学习手册 绝对不在其中。

Python 参考手册

权威且实用 Python 书籍,覆盖 Python 2和 Python 3。尽管它名为参考手册,但 Python 参考手册 在 Python 语法和标准库基础之上对其实现机制也给出了深入的讲解,不容错过。

编程语言理论

编程语言实现模式

大多数程序员并不需要从头编写一个编译器或解释器,因此龙书(编译原理) 就显得过于重量级;然而多数程序员还是需要解析文本,处理配置文件,或者写一个小语言,编程语言实现模式很好的满足了这个需求。它把常用的文本解析/代码生成方法组织成一个个模式,并为每个模式给出了实例和应用场景。这本书既会提高你的动手能力,也会加深你对编程语言的理解。Python发明者Guido van Rossum甚至为这本书给出了“Throw away your compiler theory book!” 这样的超高评价。

程序设计语言——实践之路

程序员每天都要和编程语言打交道,但是思考编程语言为什么会被设计成这个样子的程序员并不多, 程序设计语言—实践之路这本书完美的回答了这个问题。

这本书从编程语言的解析和运行开始讲起,系统了介绍了命名空间,作用域,控制流,数据类型以及方法(控制抽象)这些程序设计语言的核心概念,然后展示了这些概念是如何被应用到过程式语言,面向对象语言,函数式语言,脚本式,逻辑编程语言以及并发编程语言这些具有不同编程范式的编程语言之上。这本书或极大的拓宽你的视野——无论你使用什么编程语言,都会从这本书中获益良多。理解这一本书,胜过学习十门新的编程语言。

4. 程序设计

程序设计方法

现代编程语言的语法大多很繁杂,初学者使用这些语言学习编程会导致花大量的时间在编程语言语法(诸如指针,引用和类型定义)而不是程序设计方法(诸如数据抽象和过程抽象)之上。 程序设计方法 解决了这个问题——它专注于程序设计方法,使得读者无需把大量时间花在编程语言上。这本书还有一个与之配套的教学开发环境 DrScheme ,这个环境会根据读者的程度变换编程语言的深度,使得读者可以始终把注意力集中在程序设计方法上。

我个人很奇怪 程序设计方法 这样的佳作为什么会绝版,而谭浩强C语言这样的垃圾却大行其道——好在是程序设计方法 第二版 已经被免费发布在网上。

计算机程序的构造与解释

计算机程序的构造与解释是另一本被国内大学忽视(至少在我本科时很少有人知道这本书)的教材,这本书和程序设计方法有很多共同点——都使用 Scheme 作为教学语言;都专注于程序设计方法而非编程语言本身;都拥有相当出色的课后题。相对于 程序设计方法 , 计算机程序的构造与解释 要更加深入程序设计的本质(过程抽象,数据抽象,以及元语言抽象),以至于 Google 技术总监 Peter Norvig 给了这本书 超高的评价 。

5. 算法与数据结构

算法

算法这本书的使用更为容易的Java语言作为教学语言;覆盖所有常用的数据结构和算法,并均给出其完整实现;包含大量的图示用于可视化算法——事实上这是我度过的图示最为丰富形象的书籍,这也是被称为最好的算法入门书籍的原因。

编程珠玑(第 2 版)

编程珠玑(第 2 版)是一本少见的实践型算法书籍——它并非一一介绍数据结构/算法的教材,而是实践性极强的算法应用手册。作者( Jon Bentley )从他多年的实际经验精选出一些有趣而又实用的问题,然后展示了他解决这些问题的过程(分析问题,选择合适的算法,解决问题,以及验证答案)。任何程序员都可以从中获益。

6. 程序调试

调试九法

一个让非编程从业人员惊讶的事实是程序员的绝大多时间都花在调试上,而不是写程序上,以至于 Bob 大叔把调试时间占工作时间的比例作为衡量程序员开发能力的标准。 调试九法——软硬件错误的排查之道 既是调试领域的入门作品,也是必读经典之作。 调试九法这本书的作者是一个具有丰富实战经验的硬件工程师,他把他多年的调试经验总结成九条调试法则,并对每一条法则都给对应的实际案例。任何程序员都应通过阅读这本书改善调试效率,即便是非程序员,也可以从这本书中学到系统解决问题的方法。

软件开发

1. 编程实践

程序设计实践

Brian Kernighan 是这个星球上最好的计算机书籍作者:从上古时期的 Software Tools ,到早期的 Unix编程环境 和 C 程序设计语言,再到这本程序设计实践 ,每本书都是必读之作。

尽管程序设计实践只有短短 200 余页,但它使用精炼的代码和简要的原则覆盖了程序设计的所有关键概念(包括编程风格,算法与数据结构,API 设计,调试,测试,优化,移植,以及领域特定语言等概念)。如果你想快速掌握良好的编程实践,或者你觉着900多页的代码大全过于沉重,那么程序设计实践是你的不二之选。我第一次读这本书就被它简洁的语言和优雅的代码所吸引,以至于读研时我买了三本程序设计实践——一本放在学校实验室,一本放在宿舍,一本随身携带阅读。我想我至少把它读了十遍以上——每一次都有新的收获。

代码大全

无论在哪个版本的程序员必读书单,代码大全都会高居首位。和其它程序设计书籍不同, 代码大全这本书用通俗清晰的语言覆盖了软件构建(Software Construction)中各个层次上所有的重要概念——从变量命名到类型设计,从控制循环到代码结构,从测试和调试到构建和集成,代码大全可谓无所不包,你可以把这本书看作为程序员的一站式(Once and for all)阅读手册。

更珍贵的是, 代码大全 在每一章末尾都给出了价值很高的参考书目(参考我之前的 如何阅读书籍 一文),如果你是一个初出茅庐的程序员,代码大全是绝好的阅读起点。

2. 面向对象程序设计

Head First

无论是在Amazon还是在Google上搜索设计模式相关书籍,Head First设计模式都会排在首位——它使用风趣的语言和诙谐的图示讲述了观察者、装饰者,抽象工厂,和单例等关键设计模式,使得初学者可以迅速的理解并掌握设计模式。 Head First 设计模式 在Amazon上 好评如潮,就连设计模式原书作者 Erich Gamma 都对它给出了很高的评价。

需要注意, Head First设计模式 是非常好的设计模式入门书,但千万不要把这本书作为学习设计模式的唯一的书——是的,Head First 设计模式拥有风趣的语言和诙谐的例子,但它既缺乏实际的工程范例,也没有给出设计模式的应用/适用场景。我个人建议是在读过这本书之后立即阅读 “四人帮” )的 设计模式 或 Bob 大叔 的 敏捷软件开发 ,以便理解设计模式在实际中的应用。

设计模式

设计模式作为设计模式领域的开山之作,Erich Gamma,Richard Helm,Ralph Johnson等四位作者将各个领域面向对象程序开发的经验总结成三大类23种模式,并给出了每个模式的使用场景,变体,不足,以及如何克服这些不足。这本书行文严谨紧凑(四位作者都是PhD),并且代码源自实际项目,属于设计模式领域的必读之作。

需要注意: 设计模式不适合初学者阅读——它更像是一篇博士论文而非技术书籍,加上它的范例都具有很强的领域背景(诸如 GUI 窗口系统和富文本编辑器),缺乏实际经验的程序员很难理解这本书。

3. 重构

重构

任何产品代码都不是一蹴而就,而是在反复不断的修改中进化而来。 重构这本书正是这样一本介绍如何改进代码的书籍——如何在保持代码行为的基础上,提升代码的质量(这也是重构的定义)。

我见过很多程序员,他们经常声称自己在重构代码,但他们实际只做了第二步(提升代码的质量),却没有保证第一步(保持代码行为),因此他们所谓的重构往往会适得其反——破坏现有代码或是引入新bug。这也是我推荐重构这本书的原因——它既介绍糟糕代码的特征(Bad smell)和改进代码的方法,也给出了重构的完整流程——1. 编写单元测试保持(Preserve)程序行为;2. 重构代码;3. 保证单元测试通过。 重构 还引入了一套重构术语(诸如封装字段,内联方法,和字段上移),以便程序员之间交流。只有理解了这三个方面,才能算是理解重构。

修改代码的艺术

这里再重复一遍重构的定义——在保持代码行为的基础上,提升代码的质量。 重构 专注于第二步,即如何提升代码的质量,而修改代码的艺术专注于第一步,即如何保持代码的行为。

提升代码质量并不困难,但保持代码行为就难多了,尤其是对没有测试的遗留代码(Legacy Code)而言——你需要首先引入测试,但遗留代码往往可测试性(Testability)很差,这时你就需要把代码变的可测试。修改代码的艺术包含大量的实用建议,用来把代码变的可测试(Testable),从而使重构变为可能,使提高代码质量变为可能。

4. 软件测试

How to Break Software

关于软件测试的书籍很多,但很少有一本测试书籍能像How to Break Software这般既有趣又实用。不同于传统的软件测试书籍(往往空话连篇,无法直接应用), How to Break Software这本书非常实际——它从程序员的心理出发,分析软件错误/Bug最可能产生的路径,然后针对这些路径进行残酷的测试,以保证软件质量。

我在第一次阅读这本书时大呼作者太过“残忍”——连这些刁钻诡异的测试招数都能想出来。但这种毫不留情(Relentless)的测试风格正是每个专业程序员所应具备的心态。

注意:如果你是一个测试工程师,那么在阅读这本书前请三思——因为阅读它之后你会让你身边的程序员苦不堪言,甚至连掐死你的心都有 。

xUnit Test Patterns

How to Break Software 注重黑盒测试,而这本 xUnit Test Patterns 则注重白盒测试。正如书名所示, xUnit Test Patterns 覆盖了单元测试的每个方面:从如何编写良好的单元测试,到如何设计可测试(Testable)的软件,再到如何重构测试——可以把它看作为单元测试的百科全书。

5. 项目管理

极客与团队

很多程序员都向往成为横扫千军(One-man Army)式的“编程英雄”,但卓越的软件并非一人之力,而是由团队合力而成。

极客与团队就是这样一本写给程序员的如何在团队中工作的绝好书籍,它围绕着 HRT 三大原则(Humility 谦逊,Respect 尊重,和Trust信任),系统的介绍了如何融入团队,如何打造优秀的团队,如何领导团队,以及如何应对团队中的害群之马(Poisonous People)。这本书实用性极强,以至于 Python 之父 Guido van Rossum 都盛赞这本书 “说出了我一直在做但总结不出来的东西”

人月神话

尽管人月神话成书于40年前,但它仍是软件项目管理重要的书籍。人月神话 源自作者Fred Brooks领导并完成System/360和OS/360这两个即是放到现在也是巨型软件项目的里程碑项目的经验总结。它覆盖了软件项目各个方面的关键概念:从工期管理( Brooks定律 )到团队建设( 外科团队 ),从程序设计(编程的本质是使用正确的数据结构)到架构设计( 概念完整性 ),从原型设计(Plan to Throw one away)到团队交流(形式化文档+会议)。令人惊讶的是,即便40年之后,人月神话这本书中的关键概念(包括焦油坑,Brooks定律,概念完整性,外科团队,第二版效应等等)依然适用,而软件开发的核心复杂度仍然没有得到解决(没有银弹 )。

6. 专业开发

程序员修炼之道

不要被庸俗的译名迷惑,程序员修炼之道是一本价值极高的程序员成长手册。

这本书并不局限于特定的编程语言或框架,而是提出了一套切实可行的实效(Pragmatic)开发哲学,并通过程序设计,测试,编程工具,以及项目管理等方面的实例展示了如何应用这套开发哲学,从而使得程序员更加高效专业。有人把这本书称之为迷你版 代码大全 —— 代码大全给出了大量的优秀程序设计实践,偏向术;而程序员修炼之道给出了程序设计实践背后的思想,注重道。

程序员职业素养

程序员修炼之道指出了如何成为专业程序员,这本程序员职业素养则指出了专业程序员应该是什么样子——承担责任;知道自己在做什么;知道何时说不/何时说是;在正确的时间编写正确的代码;懂得自我时间管理和工期预估;知道如何应对压力。如果你想成为专业程序员(Professional Developer)(而不是码农(Code Monkey),这本书会为你指明前进的方向。

7. 大师之言

奇思妙想

奇思妙想:15 位计算机天才及其重大发现 是一本极具眼光的技术访谈书籍——在这本书访谈的 15 位计算机科学家中,竟出现了 12 位 图灵奖 获得者——要知道图灵奖从 1966 年设奖到现在也只有六十几位获奖者而已。

奇思妙想把计算机科学分为四大领域:编程语言;算法;架构;人工智能。并选取了每个领域下最具代表性的计算机科学家进行访谈。因为这些计算机科学家都是其所在领域的开拓者,因此他们能给出常人无法给出的深刻见解。通过这本书,你可以了解前三十年的计算机科学的发展历程——计算机科学家做了什么,而计算机又能做到/做不到什么。从而避免把时间浪费在前人已经解决的问题(或者根本无法解决的问题)上面。

编程人生

同样是访谈录,同样访谈 15 个人, 编程人生把重点放在程序员(Coders at work)上。它从各个领域选取了15位顶尖的程序员,这些程序员既包括 Ken Thompson 和 Jamie Zawinski 这些老牌Unix黑客,也包括 Brad Fitzpatrick 这样的80后新生代,还包括 Frances Allen 和 Donald Knuth 这样的计算机科学家。这种多样性(Diversity)使得 编程人生 兼具严谨性和趣味性,无论你是什么类型的程序员,都能从中受益良多。

8. 界面设计

写给大家看的设计书

书如其名, 写给大家看的设计书是一本面向初学者的快速设计入门。它覆盖了版式,色彩,和字体这三个设计中的关键元素,并创造性的为版式设计总结出CRAP四大原则(Contrast 对比,Repetition 重复,Alignment 对齐,Proximity 亲密)。全书使用丰富生动的范例告诉读者什么是好的设计,什么是不好的设计,使得即便是对设计一无所知的人,也可以从这本书快速入门。

认知与设计

写给大家看的设计书强调实践,即如何做出好的设计; 认知与设计:理解 UI 设计准则 强调理论,即为什么我们会接受这样的设计而反感那样的设计。如果你想要搞清楚设计背后的心理学知识,但又不想阅读大部头的心理学著作,那么 认知与设计是你的首选。

9. 交互设计

通用设计法则

书如其名, 通用设计法则给出了重要的 125 个设计原则,并用简练的语言和范例展示了这些原则的实际应用。每个原则都有对应的参考文献,以便读者进一步学习。我之所以推荐这本书,是因为:1. 程序员需要对设计有全面的认识;2. 程序员并不需要知道这些设计原则是怎么来的,知道怎么用即可。这本书很好的满足了这两个要求。

交互设计精髓

交互设计精髓这本书是交互设计领域的圣经级著作。交互设计专家(以及 VB 之父) Alan Cooper 在这本书中详细介绍了交互设计的原则,流程,以及方法,然后通过各种范例(主要来自桌面系统)展示了如何应用这些原则。

需要注意的是这本书的 第 4 版 已经出版,它在第三版的基础上增加了移动设计以及 Web 设计等内容。

个人成长

1. 职业规划

软件开发者路线图

软件开发者路线图是一本优秀且实用的程序员职业规划手册。这本书由若干个模式组成,每个模式都对应于程序员职业生涯中的特定阶段。通过这本书,读者可以很方便的找到自己目前所处的模式(阶段),应该做什么,目标是什么,以及下一个模式(阶段)会是什么。如果你时常感到迷茫,那么请阅读这本 路线图 ,找到自己的位置,确定接下来的方向。

2. 思维方式


程序员的思维修炼

作为程序员,我们需要不断地学习——既要学习新技术,也要学习如何解决各种领域的问题。为了提升学习效率,我们需要学习如何学习。 程序员的思维修炼 正是这样一本讲如何学习的书,它集合了认知科学,神经学,以及行为理论的最新研究成果,并系统的介绍了大脑的工作机制。通过这本书,你将学会如何高效的使用自己的大脑,从而提高思考能力,改善学习效率。


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.

为什么同样资质的人,大多数人会碌碌无为,而只有极少数能做到登峰造极?如何在领域内做到顶尖?如何克服通往顶尖之路上的重重险阻? 如何把事情做到最好回答了这些问题,并极具哲理的指出登峰造极并不是结果,而是一段永不停止的旅程。阅读这本书不会让你立刻脱胎换骨,但它会指引你走向正确的道路——通往登峰造极之路。

3. 求职面试

金领简历

知己知彼,百战不殆。 金领简历:敲开苹果微软谷歌的大门是程序员求职的必读书籍,它覆盖了程序员求职的方方面面:从开始准备到编写简历,从技术面试到薪酬谈判。由于该书作者曾在 Google,微软,和苹果任职并进行过技术招聘,因此这本书的内容非常实用。

顺便吐个槽:这本书翻译的还不错,但我实在无法理解封面上的“进入顶级科技公司的葵花宝典”这段文字——找个工作而已,用不着这么凶残吧。

程序员面试金典

同样是来自金领简历作者的作品, 程序员面试金典(第 5 版) 专注于技术面试题,它既包含了 IT 企业(诸如微软,Google,和苹果)的面试流程以及如何准备技术面试,也包含了大量(超过200道)常见技术面试题题目以及解题思路。无论你打算进入国内企业还是外企,你都应该把这本书的题目练一遍,以找到技术面试的感觉(我在求职时就曾经专门搞了一块白板,然后每二十分钟一道题的练习,效果很不错)。

4. 英语写作

词汇量决定阅读能力,语法决定写作能力。计算机专业词汇并不多,但精确性非常重要,因此每个程序员都应具备良好的英语语法,但程序员并不需要过于专业的英语语法——掌握常用语法并把它用对就可以。 The Only Grammar Book You’ll Ever Need 正好可以满足这个需求,尽管它篇幅不大(不足 200 页),却覆盖了英语中的关键语法以及常见错误。把这本书读两遍,它会大幅度提高你的英语写作能力。

既是最畅销的英语写作书籍,也是计算机书籍中引用最多的非计算机书籍。 风格的要素用极其简练的语言讲述了如何进行 严肃精确清楚的英语写作。从这本书中,你不仅可以学到英语写作,更可以学到一种严谨至简的处事态度,而这正是专业开发所必需的。

以上书单覆盖了软件开发各个关键领域的入门书籍和必读书籍,它可以满足绝大多数程序员的需求,无论你是初学者,还是进阶者,都可以从中获益。