Electronic Joint Business

Solution for E-Business

visual studio

.NET 编译平台 (Roslyn) 概述

文章评价:
一直以来,编译器都按黑盒的方式运作 — 这头放入源代码,中间部分施展魔法,在另一头就会生成目标文件或程序集。当编译器施展魔法时,它建立了对代码的深刻理解,但这些知识除了实现编译器的巫师外,旁人无法掌握。一旦生成编译输出,这些信息就被彻底忘却。几十年来,这种方式一直运作良好,但现在却不能满足需要了。

如今为了提高生产力, 人们越来越依赖于集成开发环境(IDE)所提供的智能感知、重构、智能重命名、 “查找所有引用” 和 “转到定义” 等功能。我们用代码分析工具来改善代码质量,用代码生成器来协助代码构建。想要让这些工具更聪明,就需要它们能更多地访问编译器,同时也需要对编译器中深厚的代码处理知识有更多的了解。

这就是 .NET 编译器平台(“Roslyn”)的核心使命:打开黑盒让工具和用户可以分享编译器处理代码时的大量信息。与 “源代码—目标文件”的直译方式不同,Roslyn 使编译器成为平台,这意味着工具和应用程序可以通过 API 来处理代码相关的任务。

将编译器过渡到平台,这大大降低了构建代码相关(code focused)工具与程序的门槛,在许多方面推动了创新,包括:元编程、代码生成、代码转化、C#\VB 的交互式使用、领域特定语言内嵌 C#\VB 等等。

在 .NET 编译器平台 (“Roslyn”) SDK 预览版中包括了最新的语言对象模型,可用于代码生成、代码分析与重构。我们还包括了一些 API 草稿,以便在后续的版本中实现支持脚本、C#\VB的交互式使用。本文是对 .NET 编译器平台(“Roslyn”)的概念性描述,更多情况可以参考预览版 SDK 中的演示与示例。

>>> 阅读全文

 

, , , , , , , ,

Flex 和 Bison 简介 (二)

在上一篇文章中,我们讨论了如何用 flex 和 Bison 来 创建词法分析器(标记识别器)和解析器。本文是本系列文章的第二篇,我们将会看到如何用这些工具来创建可以读取 Visual Studio 6 资源文件的解析器。本文将重点关注于词法分析器。

不过考虑到这两个工具的密切联系,我们会在解析器和词法分析器之间来回跳转。在本文的最后,你可以下载到词法分析器和解析器的源代码。

如我们在第一篇文章中讨论的,词法分析器负责从某处读取输入流,并将其分解成一连串的标记。每个标记代表着最底层的构造块,用于表示诸如字符串、 数字或关键字等等东西。词法分析器通过将输入数据和一系列正则表达式 (规则) 相匹配来实现实现这一点。当它找到和特定规则的一个匹配时,它会执行将程序员所编写的一些执行代码,并向解析器返回一个标记,用于表明哪个规则被匹配了。它还可能会返回一些与规则关联的数据。

例如下面的正则表达式。

/* Decimal numbers */
-?[09]+    {
        yylval.ival = atoi(yytext);
        return NUMBER;
    }

该表达式会匹配以负号开头的包含至少一个数的十进制数序列。(有关正则表达式的含义和格式,你可以参考:http://www.monmouth.com/~wstreett/lex-yacc/flex_1.html 并搜索的”模式”)。当找到匹配时,它会调用 atoi 函数并将字符串 yytext 传递给它作为参数,yytext 正好是符合规则的字符串。另一方面,atoi 的返回值被赋给在解析器中定义的联合 yylval 的成员 ival。最后该操作会返回一个 NUMBER 标记给解析器并终止。

>>> 阅读全文

 

, , , , ,

利用 ASP.NET MVC 4 开发 Web 应用 (一)

文章评价:
现在几乎所有的网站都不停地扩张,一旦它开始增长,你就会发现无论是编写、组织和维护一个站点都十分地困难。当我们往项目中添加新功能或添加新开发人员的时候,任何设计拙劣的大型的 Web 应用都可能会去控制。因此本文隐藏的设计思想是任何一个网站的设计,无论是对网页设计师(初级到中级)还是搜索引擎而言,其架构必须是简单、易于理解的。在这篇文章中,我想要设计一个用于维护个人联系方式的站点。任何一个大型社区都可以重用该程序及其附加功能和模块。因此,设计必须很容易适应未来的业务增长。

在这篇文章中,我将讨论如何创建和设计用户界面(UI)的方式,该方式将把 UI 将从业务逻辑分离,可以由独立的设计师/开发人员负责创建。我们将会用到的框架包括 ASP.NET MVC、Knockout、Jquery 和 Bootstrap。

在后续文章中,我们会更多地谈到有关数据库设计以及如何利用 SQL Server 2008 、Entity Framework 、Castle Windsor 依赖注入框架来实现商业逻辑。

分离关注点:主要目标
关键概念是如何剥离大部分或全部商业逻辑。商业逻辑不应和页面捆绑,否则在需要重用另一个页面里的逻辑就会难以处理。很多人会忍不住对代码进行复制粘贴。一旦这样做了,项目就变得难以维护。另一个重要概念是将业务逻辑从数据存取层剥离出来,由于我们将考虑使用 Entity Framework ,这应该不成为问题。我们可以轻松地将所有 EF 的文件放到另一个 Assembly 中,然后添加该 Assembly 的引用即可。顶层设计概念如下所示:

将这一概念贯彻到 Visual Studio 开发工具中,我们得到了最后的解决方案:

>>> 阅读全文

 

, , , , , , , ,

.NET 4.5 并行之新特性

原文

随着 .NET 4 和 Visual Studio 2010 的发布,微软为并行提供相当广泛的支持,包括: 任务并行库 (TPL)、 并行 LINQ (PLINQ)、 新的同步和协调原语集合 (如 ConcurrentDictionary),为处理并行工作负荷而改进的线程池、 新的调试器窗口、 新的并发可视化工具,等等。自那时起,微软一直致力于埋头开发新的 .NET 4.5 和 Visual Studio 11。这是对 Visual Studio 11 开发者预览的一瞥。

更好的性能

任务并行库

More and more, TPL is becoming the foundation for all parallelism, concurrency, and asynchrony in the .NET Framework. That means it needs to be fast… really fast. Performance in .NET 4 is already good, but a lot of effort was spent in this release improving the performance of TPL, such that just by upgrading to .NET 4, important workloads will just get faster, with no code changes or even recompilation required. As just one example, consider a long chain of tasks, with one task continuing off another. We want to time how long it takes to set up this chain:

>>> 阅读全文

 

, , ,

C++11 一览 (二)

简介
在本系列文章中的第一部分,我们介绍了 C++11 的一些特性。在本篇文章,我们会继续介绍其它特性。

Strongly typed enums:

As quoted by Stroustrup “C enumerations constitute a curiously half-baked concept” and very few modifications are done to rectify there shortfalls resulting in manifestation of silent behavioral changes. Let’s check an example to support this,

namespace DefenceNetwork
{
   namespace WeatherMonitor
   {
     enum CycloneWarningLevels
     {
        GREY, // Medium winds
        RED, // High speed winds
        YELLOW, // Very High speed winds
        GREEN, // Severe Cyclone
        BLUE // Very Severe Cyclone
     };
   }
   namespace ThreatMonitor
   {
     enum AlertConditions
     {
        BLUE, // Lowest readiness
        GREEN, // Increased intelligence watch
        YELLOW, // Increase in force readiness
        RED, // Next step to nuclear war
        GREY // Nuclear war is imminent
     };
   }
 }
using namespace DefenceNetwork;
void SetDEFCONLevel(int value)
{
   // ….before setting level …lets check the weather once
   using namespace WeatherMonitor;
   // ……
   // …. Ok all is fine! Lets go ahead with setting DEFCON level
   if(value >= RED)
   {
      cout<<"Nuclear war is imminent…All Missiles GO…GO…GO"<<endl;
   }
   // Here, the confusion is AlertConditions::GREEN and CycloneWarningLevels::RED are same
   // as we messed up by putting ‘using namespace WeatherMonitor’.
 }
void main()
{
   using namespace ThreatMonitor;
   // Set level to Increase intelligence watch
   SetDEFCONLevel( AlertConditions::GREEN );
   
  // Oh no… what have I done …How the war is started
  // Hope in reality they have coded better than this…but hey can we take a chance !!!
}

The problem with the enums so far is that

1. They can be silently converted to int.
In the above example SetDEFCONLevel( ) method need int and when we pass an
enumerator it happily accepted.

>>> 阅读全文

 

,

C++11 一览 (一)

C++0x 现在成为了一个正式的标准,将以下称为 C++11。在2011年,它被批准成为ISO C++。本文的目的是鸟瞰大部分的 C++11 功能,并对那些已经添加进 VS2010 的功能做出深刻的分析。本文可以作为一个平台让您对个别功能开始进行全面的研究。

背景
几乎花了一个世纪的时间,查尔斯 · 巴贝奇(Charles Babbage)的分析机(Difference Engine)才演变成强大的计算机。在四十年代,受限于当时计算机的运算速度和内存,只能使用汇编级别的语言。十年后,事情开始有所变化,从 1950 年到 1970 年期间绽放出许多编程语言,其中许多一些延续到今天。

1979 年,为贝尔实验室工作的 Bjarne Stroustrup 开始着手加强”C”语言,首先添加了类,然后是虚函数、 运算符重载,多重继承、 模板和异常处理,以及其它功能。起初他管这个语言叫“带类的C -C with Classes”。在1983年更名为 c++ (+ + 可能说它是 C 的递增) 。

C++ 大事件/演化时间表如下:

  • 1983 – 第一个商业版本的 C++ 编译器
  • 1998 – C++ 标准委员会开始标准化 C++ [C++98]
  • 2003 – 推出不带任何新功能的补丁包 [C++03]
  • 2005 – 发布了“库技术报告- Library Technical Report 简称 TR1”
  • 2011 – 引入大量的功能并增强 C++ 标准库

我们可以看出,这个变化是最大的一次(好吧,添加 STL 也可以算是大变化)。

>>> 阅读全文

 

, , ,

ArcGIS Silverlight 客户端指南 (一)

ArcGIS之所以比较普及,原因之一就是它能紧跟计算机发展的趋势,推出适合各种平台的API比如JavaScript API,Java API, Flex API,Silverlight API, 后二者是现在RIA的主流代表,开发工具、设计工具一应俱全,有人也许会问,在Flex API和Silverlight API之间该如何取舍,其实“一法通万法通”,在不同的API之间切换,并不是什么太难的问题。

[b]准备工具[/b]
假设你已经安装了Visual Studio 2010 (最新版本嘛,至少以后几年你翻我的文章还不会过期)的任何一个版本,建议安装Blend设计工具,它可以用来设计非常酷的Silverlight画面。
Silverlight 需要另外安装工程插件,即Silverlight 4的Visual studio工程插件,可以在[url=”http://www.microsoft.com/downloads/details.aspx?familyid=BF5AB940-C011-4BD1-AD98-DA671E491009&displaylang=en”]这里[/url]下载。

最后我们需要ArcGIS SL 客户端API,你需要自己注册一个ESRI Global账户,登陆后,就可以在[url=http://www.esri.com/products/index.html#developer_tools_panel”]这里[/url]下载。

[b]Hello,World[/b]

安装好上面的Silverlight 4插件和ArcGIS Client,就可以创建一个Silverlight Application工程了,并添加ESRI.ArcGIS.Client(版本1.2)的引用。

>>> 阅读全文

 

, , , , ,

用Visual Studio开发Firefox扩展 (一) 简介与准备

Firefox插件简介
Extension就是一个zip包,里面有规定的一些必要文件。这个可以下载几个插件看一下他们的目录结构就好了。我下载了一个 QuickNote,看了一下,主要包括一个install.rdf(安装包相关信息和文件资源路径等配置)、chrome.manifest(设置各种 XUL文件路径以及其他的一些资源文件路径)、chrome文件夹(里面放着插件的所有源文件),不过chrome文件夹里面的文件我还没有过多研究。

Plugin好像是另外一码事了,在Mozilla Developer Center的Plugin开发介绍文中有这么一句:Plugins are different from extensions, which modify or enhance the functionality of the browser itself. Plugins are also different from search plugins, which plug additional search engines in the search bar. (插件与扩展不同,它更改或者改善了浏览器自身的功能。插件与搜索插件又不同,搜索插件在搜索工具栏上添加了额外的搜索引擎。)

我的理解,插件可以让你在FF中使用自己的View来展示、用自己编写的二进制文件来做某些事情,不仅仅是利用FF自身支持的一些特性和功能。而扩展相对来说就不需要这些东西,只利用FF的开发API就好了。Firefox插件,也叫Mozilla插件,它是一段程序。通常,界面使用XUL语言(XML的一个子集)或者XUL内嵌HTML编写,而程序逻辑使用ECMAScript (Standard ECMA-262)(俗称JavaScript)编写。

XUL可以是独立的窗体,可以是对话,也可以是overlay。Overlay可以用于修改已经构建好的界面。下面是一段示例的XUL代码:

<overlay id="main-overlay" xmlns:html="http://www.w3.org/1999/xhtml"
        xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
 <menu id="file_menu">
  <menuitem name="Example One"/>
  <menuitem name="Example Two"/>
  <menuitem name="Example Three"/>
  <menuitem name="Example Four" position="1"/>
 </menu>
</overlay>

而JavaScript可以用来定义程序的行为。CSS可以用于自定义样式,而XPCOM可以用于调用Firefox提供的接口。另外,现在有一些JavaScript Library,可以直接使用而降低代码难度。

>>> 阅读全文

 

, , , , , , ,

用VC++ 10.0 编译Boost类库

为什么需要 Boost 类库?
原因是 C++ 提供的标准类库功能十分有限,功能大概只相当于 Java 里的 io 和 util 两个包。对于开发现代的应用程序,一个没有提供正则表达式,XML 等等类库的语言是不可想象的。Boost 就是鉴于 C++ 类库功能有限,而提供的一套免费的 C++ 函数库 ,吸收了广大高质量的 C++ 函数库,提供更强大的功能,以方便写出写出更高质量的 C++ 程序,加快程序的开发周期。

对于大部分 Boost 应用来说,它是不用编译的,直接包含头文件就可使用,如:

any
array
asio
conversion
crc
bind/mem_fn
enable_if
function
lambda
mpl
smart_pt

只有少部分需要编译成库文件,需要编译的库如下:

date_time
filesystem
function_types
graph
iostreams
math
mpi
program_options
python
regex
serialization
signals
system
test
thread
wave

要完全编译 Boost 库需要先准备一些第三方库,这里在 C: 盘建立了一个 USR 目录,在下面建立三个子目录 bin,include 和 lib,我们需要将 C:\usr\bin 加入到路径中。编译 Boost 需要三个类库,如下:

  • 1. Regex 所需 Unicode 支持类库 — ICU, 这里选用版本是4.4.6.
    编译 ICU 较为简单,解开 ICU 包之后,在其目录下可以找到一个叫”allinone”的目录,用 Visual studio 2010 打开里面的allinone.sln,分别用debug和release编译,编译之后,将 include 目录和 release 目录下的库文件拷贝出来,dll 拷贝到 C:\usr\bin, 头文件拷贝到 C:\USR\include,库文件则放到 C:\USR\lib.
  • 2. Graph 所需的 Xml 处理类库 — Expat, 最新的版本是2.0.1。expat 提供了vc 6.0的项目文件:expat.dsw,用 Visual studio 2010 打开它,并转化成 2010 的项目文件即可编译。如果想要64位的库文件,请注意在配置管理中,把 platform 改成 x64。
  • 3. 编译 Boost.MPI 所需 MPI 类库 — Boost 的官方站点说需要 MPICH 或 OpenMPI 之类的支持,但是在 Windows 编译环境中总是会提示需要 MPIC++,其实你需要的是Microsoft Cluster Pack SDK,下载并默认安装在 c:\Program Files\Microsoft Compute Cluster Pack 下。当然你也可以用 Microsoft HPC Pack 2008 SDK,效果是一样的。

不过,如果下载的是 Microsoft HPC Pack 2008 SDK,或者 Microsoft Compute ClusterPack 不是装到默认的路径下,那 bjam 就会提示找不到 mpic++ 的路径,这时候需要修改一下 mpi.jam(在tools\build\v2\tools),用 notepad 打开它,找到 “local cluster_pack_path_native” 这行,改成:

>>> 阅读全文

 

, , , , , , ,

Axum, 一切为了并行 (一)

编写并行程序并不容易,首先要将方案切割为许多并行任务(Task)。较为简单的方案,如计算每只股票的年收益率,很容易实施并行,因为任务之间彼此独立。但另外一些方案则十分复杂,任务之间彼此依赖且要相互协作,比如网络游戏。

Axum试图提供一种更为自然的方式来安排组件之间的协作问题。换句话说,如果将方案按照交互式组件建模,在Axum中编码会更为直接了当,而且你可能可以不被许多常见的并发问题所困扰。

并行的另一个目的是为了提速。经常,程序的反应速度总被象I/O或者用户输入这样的慢速组件所拖累。比如email客户端通过慢速的网络下载邮件的时候,程序还应该能继续响应用户的动作。

Axum的目标之一就是程序不需要再担心并发问题,理论上,你的程序将变得快速而且响应及时。为此,Axum不允许自由的共享和变更线程的状态,而只允许“有节制地”存取共享的状态,这解决了许多并发问题。

从”Hello,World”开始

>>> 阅读全文

 

, , ,

用C#编写 IE BHO

在前面几篇文章都是用 VC++ 完成的,为了更加快开发速度,很多程序员会考虑使用 C# 等更便捷的开发方式,这里我们采用 Visual Studio 2010 作为开发工具,你也可以采用 Visual studio 2008,其界面和开发过程与 Visual Studio 2010 类似。

这儿, 我们也简单介绍一下 BHO. BHO 是将自定义功能添加到 Internet Explorer 的轻型 DLL 扩展,除了 IE, BHO 还可以将功能添加到 Windows 资源管理器外壳程序. BHO 通常并不提供其自身的任何用户界面 (UI)。它们而是通过在后台响应浏览器事件和用户输入数据来发挥作用。例如,BHO 可以拦截弹出窗口、自动填充窗体或为鼠标手势添加支持。

在阅读本文之前,建议安装 Visual studio 的 SDK,因为里面提供了包装了 OLE 的装配件, >> 点击下载。如果觉得 Visual Studio SDK 安装包太庞大, 本文也提供了需要几个 OLE 接口的C#源代码。

我们知道,BHO 的生命周期与它所交互的浏览器实例的生命周期相等。在 IE 6 和早期版本中,这意味着要为每个新的顶层窗口创建(和销毁)一个新 BHO。在IE 7中则是为每个选项卡都创建和销毁一个新 BHO。

BHO 必须实现 IObjectWithSite 接口, 该接口提供了两个方法GetSite和SetSite。请在项目中引用” Microsoft.VisualStudio.OLE.Interop “这个装配件。如果没有安装 Visual Studio SDK, 你可以在项目中加入这段 IObjectWithSite 接口的源代码。

>>> 阅读全文

 

, , , ,

初窥Nemerle语言

Nemerle是Microsoft的研究项目之一,由 Wrocław 大学的Kamil Skalski、Michał Moskal、Prof. Leszek Pacholski、Paweł Olszt等人发明,从2003年0.2版本开始,Nemerle不断地在改进中。

作为一种新的语言,Nemerle有什么特点呢? Nemerle是一种多范型的语言(面向对象和函数式),完全支持编译器宏(更类似是Lisp的变种,而不是C++),以及许多其他的东西。Nemerla与VS2010里发布的F#不同,后者是纯函数式语言。因此,Nemerle提供了与C#近似的语法和强大的元编程系统。

有关meta-program可以参考:wiki百科

你可以在官方站点下载它的最新发布,在发布包中还带有与visual studio的集成的IDE,可以很方便地学习Nemerle语言,最新版本是1.0 RC1。

这篇文章将带你快速浏览一下Nemerle的一些语言特性。

>>> 阅读全文

 

, , ,

用Visual Studio 2008开发IE浏览器帮助对象 之三

接下来,我们要为IE增加一个按钮(注意不是toolbar,toolbar要复杂得多),基本这是一个注册表的魔术.打开RayBHO.rgs, 添加

HKLM
{
        NoRemove Software
        {
                NoRemove Microsoft
                {
                        NoRemove ‘Internet Explorer’
                        {
                                NoRemove Extensions
                                {
                                        ForceRemove ‘{1AC31710-6759-484f-A129-A70C55485DA1}’
                                        {
                                                val ButtonText = s ‘Hello,World’
                                                val Icon = s ‘%MODULE%,201’
                                                val HotIcon = s ‘%MODULE%,202’
                                                val CLSID = s ‘{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}’
                                                val ClsidExtension = s ‘{057F3E68-6C2E-40A5-A641-E8CF9D6766F3}’
                                                val ‘Default Visible’ = s ‘yes’
                                        }
                                }
                        }
                }
        }
}

当然,你也可以把这一项放在HKCU(Current User)下,这样的话,该Button只对当前用户起作用。这些注册表项说明如下:

ForceRemove ‘{1AC31710-6759-484f-A129-A70C55485DA1}’ 该extersion的CLSID,请自己用GUID这个程序生成.
val ButtonText = s ‘Hello,World’ // 按钮上的文字说明
val Icon = s ‘%MODULE%,201’ // 按钮的图标,可以是icon的绝对路径,也可以和我的例子一样从资源文件里加载.
val HotIcon = s ‘%MODULE%,202’// 鼠标悬停时按钮的图标,与Icon类似.
val CLSID = s ‘{1FBA04EE-3024-11d2-8F1F-0000F87ABD16}’ //该CLSID意思为可执行,此值有特定含义,请小心修改.
val ClsidExtension = s ‘{057F3E68-6C2E-40A5-A641-E8CF9D6766F3}’ // 这个是RayBHO的CLSID,即表示该按钮的动作连接到RayBHO这个com上,具体值有所不同,必须查询你自己的rgs文件得到.
val ‘Default Visible’ = s ‘yes’//按钮可见.

当然你也可以不使用COM来响应按钮的动作,另外两个键Exec和Script,可以设置响应的程序或者脚本..这个不是重点.现在编译,然后从IE的自定义工具栏将这个按钮拖出来…如图所示:

点点看…..结果呢? 当然是不起作用!

>>> 阅读全文

 

, , ,

用Visual Studio 2008开发IE浏览器帮助对象 之二

上一篇文章开发的RayBHO只是BHO的一个框架,根本不具备任何功能. 在这篇文章里,我们将使继续扩展这个BHO,让它具备更强的功能.首先我们学习如何让BHO接收IE的事件通知,接者学习为ie添加一个按钮,并让BHO对按钮做出响应. 要让BHO能接收事件通知, 它必须让处理函数与浏览器事件建立连接点. 为响应这些事件,它必须实现IDispEventImpl, ATL提供了一个默认实现,可以帮助简化这个事件处理逻辑。 在RayBHO.h添加: #include "exdispid.h" #include "shlguid.h" 我们的CRayBHO必须派生自IDispEventImpl,修改后的代码如下: class ATL_NO_VTABLE CRayBHO :  public CComObjectRootEx,  public CComCoClass,  public IObjectWithSiteImpl,  public IDispatchImpl,  public IDispEventImpl&lt;1,CRayBHO,&DIID_DWebBrowserEvents2,&LIBID_SHDocVw,1,1>; DispEventImpl为处理事件提供了一种简单安全的方法。 IDispEventImpl与事件路由表配合工作,可以将事件路由到相应的处理程序函数。在例子中,我们将”DocumentComplete”的事件交由OnDocumentComplete函数进行处理. 在public段添加路由表: BEGIN_SINK_MAP(CHelloWorldBHO) SINK_ENTRY_EX(1, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete) END_SINK_MAP() 上述声明中SINK_ENTRY_EX(1,…)中的”1″与接口声明中的IDispEventImpl<1,….>是对应的,在必要时可以用于区分来自不同接口的事件.

 

, , ,