Friday, November 28, 2008
假定你已经使用免费的Visual Studio Express Edition开发了一个程序,现在你想对公众部署这个程序。
我们的话题就此开始!
创建一个新的部署工程:
1. 在“File”菜单里,点击“Add”,并单击“New Project”;
2. 在弹出“Add New Project”对话框的“Project Type”面板中,展开“Other Project Types”结点,然后选择“Setup and Deployment Projects”;
3. 在“Templates”面板中,选择你想要创建的部署工程类型;
在这个例子中,我使用的版本是Visual Basic 2008 Express Edition,所以当我打开“New Project”对话框的时候,没有“Other Project Types”这个结点。
答案是:当你抛出它的时候
从CLR 2.0开始,触发StackOverflowException异常的条件就改变了,用户不能触发这个异常(备注1),如果发生异常的话取而代之的是CLR会直接结束掉发生异常的进程。
但是事实并不是100%如此,用户代码仍然能够人为抛出StackOverflowException异常,当然不是通过真正的溢出错误,而是用户手动调用。这和文档上说得不一样,这里我们用一个不太规范但是很简单的程序来说明这种情况。(见备注)
当然,这种用法没什么特别的,但是我还是觉得有必要提到这点,因为最近我看了一个新讨论组的谈话记录,有人发布了些简单的异常触发代码,碰巧里面提到StackOverflowException。他的代码里直接抛出了这个异常,而且他也有足够的理由相信这个异常在产品代码中也可以被抛出,对此我真的感到非常惊讶。
Friday, November 07, 2008
Windows窗体的时间(Timer)类允许用户在一个时间段内执行特定的操作。时间对象会在设定的时间内开始一个Tick事件,用户可以容易的响应这个事件。如果软件开发者想在在一个指定的时间段内检查一个特定的条件(比如2秒钟,我会在这篇文章中用两秒作为范例),这时这个事件就会非常有用。
偶尔用户会惊奇的发现Tick事件会比期望当中的更快地被触发。比较在两个调用期间等待两秒钟而言,取而代之的是Tick事件几乎是在一个被调用的过程完成后就被立即被触发了。
这里所发生的是这个事件在事件循环机制作用下所产生的状态变化。时间事件的间隔期是由现实世界的时间来计算的。所以直白的讲,每隔两秒钟windows将认为时间间隔结束,然后发送一个新的Tick事件消息。下一时间段的windows窗体事件就不会再执行代码,一个tick事件会被触发【1】。
现在我们可以想象一下我们已经有如下的代码。
Private Sub OnTimerTick () Handles m_timer.Tick
RunSomeOperation
大多数XSLT程序员对于下面这段复制一个XML文件的XSLT转换都非常熟悉。
这种XSLT身份转换的应用十分普遍,因为它可以让你复制整个XML文档,并且会“访问”到每一个XML节点和属性。如果你添加一个模板,那么它就会对那些存在匹配的节点或属性进行转换,而那些不存在匹配的节点和属性只会被简单的拷贝。
一言以蔽之:不会,任何情况都不回被截短。
我和同事前几天聊到一个有趣的案例,它涉及到IntPtr, Pinvoke以及64bit整体概念的准确性。 最终这场讨论把我们引向对IntPtr处理long类型的构造函数。令我吃惊的是,这个构造函数的是这么写的:
public unsafe IntPtr(long value) { this.m_value = (void*) ((int) value); }
问题在于long类型的值被肆意地截短成一个int值。这将直接导致丢失一切越过4G的内存地址 (换言之,没有64bit的寻址)。这个确确实实放在眼前的大漏洞,使我想到这是不是有可能是个反编译器(disassembler)的bug。于是我用了.NET Reflector的IL模式。
L_0000: ldarg.0
L_0001: ldarg.1
L_0002: conv.ovf.i4
L_0003: conv.i
L_0004: stfld void* System.IntPtr::m_value
Monday, November 03, 2008
手册3告诉我们一种使用XML Descendant axis property和使用 ReplaceWith来操作混合XML的方法。这是ID转换的一种方式,我们将在下一篇文章中提到另外一种方法。这里有一个 第三章没有提到的主特性,这个主功能需要你进行完全化地功能性特性转变。那就是从一个元素中复制内部XML的概念。你可以从Node属性中获得元素的内部XML.
第三章将电子邮件对象通过特性转换将AdventureWorks示例文档转换成以原版格式保存的HTML 文档并提供它的超链接。然而,为了让第三章所作的事情简单化,我忽略了这样一件事情,那就是 元素的schema(可以在ContactTypes.xsd schema 文件中找到)既允许 元素包括邮件地址,也允许 元素作为一个辅助信息比如用电话号码将电子邮件地址替换掉,还有合适打电话等等。 元素可以包含任何ContactTypes.xsd 中其他元素的ID. 为了让 元素包含所有信息
Saturday, November 01, 2008
在前两次的手册中,我们讲了关于用ReplaceWith这个方法来进行身份转换.如果这个方法满足了你的需要,它会在你的代码中引发另外一个问题--"Halloween".让我们看看这个问题到底是怎样的,怎么样去解决.(详细的"Halloween"问题和解决方案可以参考这个文档).
"Halloween"描述的场景是,你有一个以某种方式更新的数据集同时这个数据集又在被遍历的话,你会得到一个空引用的异常,更坏的是,你的代码可能会因为修改错误的数据而崩溃.例如前面两个手册用到的代码段:
Friday, October 31, 2008
我正在做一个关于用Visual Basic XML Literals取代XSLT转换的博客,我发现这个博客将会很长,所以,Avner Aharoni 和我谈了之后决定像几个月前我们做的LINQ操作指南一样把它分为多个条目并成一个系列。
先介绍一下VB XML的操作指南。这个操作指南介绍了如何在Visual Basic中使用XML Literals的快速而简单的方法。在很多情况下,我们将会参考有着直接或者是相近功能的XSLT和XPath。你将会发现用XML Literals来转换和翻译XML是一件快速而简单的事情,XML的轴属性,和LINQ到XML,这一切都是从Visual Basic 2008开始的。
首先介绍如何用XML Literals和LINQ执行简单的XML转换。每个例子都用了一个嵌入式表达,从LINQ队列或者其他的资源,比如属性或函数中返回一组XML Literals,只需几行Visual Basic代码就能完成整个XSLT的转换。
昨天,我答应写一篇关于 Visual Basic 和 Visual Studio 2008里隐藏彩蛋的文章,这些彩蛋是你们在博客帖子或会议上从未见过的。我曾提及到了一些我最喜爱的特性,在BataⅠ版本的阐述中我尽情炫耀了智能感知(intellisence)的改进,尤其是对关键字、本地变量和表达式,自动完成语句的改进。在那篇文章中,我也提到一种语法新特性-非严格委托(Relaxed Delegates),它允许你为事件(event)提供一个可替代的签名(alternate signatures)。这些都是很棒的特性--但我要告诉你一些“新”玩意!
经过队员们的民意调查,最终我们挑选出了10个最重要的特性,我以前的文章里没有提及过的。我这里只是简单介绍,有兴趣的朋友可以继续研究。首先 ,我必须从基调特性(keynote feature)开始讲……
Wednesday, October 29, 2008
配料:
· Visual Studio 2008 (Beta2或更高版本)
类别:LINQ-ToXML
步骤:
· 使用VB 创建一个新的Console Application。
· 创建RSS文档。添加以下代码到Sub Main中。
Tuesday, October 28, 2008
我非常兴奋的宣布我们最近发布了一个工具,这个工具对我们在托管代码中使用PInvoke非常有用。这个工具的名字是“PInvoke Interop Assistant”,“PInvoke Interop Assistant”作为PInvoke和Reverse PInvoke场景的一部分已经被包含在MSDN文章中。
下面的链接是文章和工具
· Article:http://msdn2.microsoft.com/en-us/magazine/cc164193.aspx
· Tool:CLRInsideOut2008_01.exe
开发这个工具背后的动力是写PInvoke是一个艰难并且乏味的任务。有很多规则必须遵守,很多异常必须要考虑到。所有在简单的数据结构之外的东西必须专心的做,C当中微妙的语义会很大程度上改变所需的签名。不正确的翻译经常会导致不明确的异常或者崩溃。
这个手册主要是讲,在XML文件中怎样使用Visual Basic,XML轴属性和LINQ toXML对象访问子和父元素。
子代
Visual Basic提供XML轴属性,可以很容易的引用子节点和标记。这是使用XML经常会遇到的情况。你可能会需要引用下一级元素在XML的数据层次上的不同层级上出现。那样的话,你可以使用XML 子代轴属性。
XML子代轴属性是用三个跟随着你想引用的XML元素的周期来定义的。例如,在手册1中用到的AdventureWorks contacts source文件中(你可以从手册1下载这个XML文件和相关的模式)。里面有个
元素,包括了关于联系方式例如电话号码,发货和帐单地址等等的信息。在元素里面的电话号码可以出现在这个元素值里面的任何位置。最终,你就可以用XML子代轴属性来引用电话号码这个元素。例如:
XSLT中的身份转换顾名思义:就是将一种元素或属性的格式替换为另一种新的格式。尤其当处理一些结构中比较灵活的XML标识时,格式转换就显得特别关键。就像新闻的文章结构,不管标题在文章的什么地方被提及,都会被突显为斜体。但是,在XML样式中并不用为文章指定斜体格式,而是指定表明标题类型的词语,这样不同的转换就可以用自己的方式来处理词语。当你想要将这样的XML文档转换成易读的格式(如HTML),你除了要完整地保留原文内容,还需要保持突显的词语周围的文本结构。就比如说:
This week a remastered version of the movie Raider’s of the Lost Ark was released.
转换为:
LINQ的核心要求任何数据源能够被查询,这基本上意味着它必须实现IEnumerable接口(实际情况要更复杂一点,详细的说明请参见Visual Basic 9.0语言规范之11.21.2一节,)。现在,当使用LINQ对Dataset进行工作时我们就有了一个问题:DataTable没有实现IEnumerable,那么我们该如何来对它进行查询?
Monday, October 20, 2008
你用过自动完成代码段么(参看VB2005中的介绍)?如果用过的话,你可能会注意到编辑文件时出现的绿色高亮提示,它们伴随着编辑文件的始终。我们已经收到很多关于编辑自动完成代码段时,高亮提示显示很散乱的抱怨,所以,在VB2008中我们改进了使用自动完成代码段时的用户体验。同时也增加了许多新的命令来控制高亮提示是否隐藏。接下来让我们来看一下在VB2008中有哪些改进…
自动完成代码段可以手动(右键点击->插入自动完成代码段)或自动插入。在VB2008中,所有根据关键字自动插入的自动完成代码段都是显示在自动完成提示框中的,例如下图:
当我开始钻研数据绑定时,在WPF中我最想念的一项功能,是在BindingListCollectionView和我所喜欢的winforms BindingSource之间的一致性功能。BindingListCollectionView就像在winforms下的资源捆绑一样,提供了限制收集数据(或数据表)的导航、流动、过滤和排序。
然而在合集中并不支持处理添加和删除项目。你可以从我的WPF窗体数据录像中注意到,当我从数据中添加或者删除一行时,我只能直接进入数据表进行操作。当我用数据表工作时这不会有问题,因为他们可以做他们自己的处理编辑(连同修改记录)。不过,为了有良好的客户业务集合,实现典型的绑定接口,这通常是一个必要的功能。
Saturday, September 27, 2008
最近我在考虑一些关于如何使用LINQ查询XML文档(或片段)中一个特定节点并且改变其值的问题(这说明人们已经开始用这种方法了,这很是让我激动)。这是一个很方便的方法:我们可以改变查询返回节点的值,这样源XML中的值也会跟着改变。
一个例子:
Monday, September 22, 2008
上一节我讲到用XML编写动态WPF UI, 尽管这里的UI是动态生成的,但仍有一处不尽人意的地方,就是我们采用的是一个具体的对象customer(来源于LINQ to SQL classes)。 如果想要我们的应用程序既能够动态生成WPF UI 又能动态地编辑处理数据库里的任何表数据,就需要进一步参数化程序代码 ——而不仅限于customer。 这样只需要修改数据库表的定义而不用更新对象模块和重新编译代码。
实现方法是试图在运行时加载,处理一个简单的无类型的(或者称作通用类型)DataTable,并运用XML literals特性 –为SqlDataAdapter生成SELECT和UPDATE语句。要注意一件事情,这个过程必须依赖数据库验证规则。因此这种方式只能用于处理非常简单的表(缩略语.维护表)。
Friday, September 19, 2008
昨天我从微软的一员工那里收到一封email,内容是关于体验一下他正在设计的一个工具Open XML Diff。 他的名字叫Pranav Wagh。 他也发布了这个工具的一个版本,可以从他的博客上看到。
当你准备写代码去生成一个开放XML文档,而且当你不确定要写的XML语句是什么的时候,你可以使用Open XML Diff。也就是说你知道你想要的文档在Word中是如何呈现的,但是不是很明白怎样去设置某个元素或者属性。你可以保存一个文档的备份,修改并且保存它,然后用此工具比较前后两个文件,就能使你看出你所需要的XML语法。
在辛苦又有成果的工作后,我们完成了质量控制的里程碑。这个里程碑的目的是让我们准备好开发下一版本的Visual Studio,Team System和.NET。虽然这些开发不是专门针对Visual Basic的,我还是选择利用这个“天字第一号讲坛”让大家知道这些努力。Visual Basic连同Visual Studio和.NET产品都是会受到影响的。
像在我前面的帖子中提到的,质量控制里程碑的工作不会包括新的特性和类似这样的事情,它的主要工作是准备工具和程序,好让我们可以开始下一个周期的工作。在开始编码之前这个是很重要的。因为在工程进度的中间做改变,是非常具有破坏性的。质量控制的里程碑的工作对于我们来说也是非常有挑战性的,而我很高兴能看到我们在设计上做的很多改变都没有造成什么问题。
Wednesday, September 17, 2008
你可能从我之前的那几篇文章中看出,我最近在研究WPF中的不同的数据案例。昨天我在摆弄WPF和.net 3.5中的数据有效性验证,而WPF和.net 3.5一起工作的非常好。在这篇文章中,我将从头到尾过一遍如何通过使用IDataErrorInfo 接口来触发你自己的数据对象中有效性验证,然后再介绍一些你能用来显示给用户的有效性验证错误信息的验证错误信息模板。
Monday, September 08, 2008
大概两星期前,我有幸出席了微软举办的产品组晚宴和稍后举办的全球 MVP 最高级会议。除了晚宴,我还有机会见到了一些MVP, 谈了在Ocras中,他们对Visual Studio和对所有新特性的印象。晚宴时,我和一个来自日本的VB MVPS组谈话,还有另外五六个VB的组员。他们其中几个人都问了我关于分部方法的问题。不幸的是,我不会说日语,所以回答起来有些困难。用英语写出来要比我用带有很多习惯用语的口语解释容易懂得多,所以我决定把分部方法作为我博客的下一篇帖子。
下面我列出了他们的问题和我的回答。