(5)具体实施方式
图1显示了在其中可以实施本发明的合适计算系统环境100的例子。计算系统环境100仅仅作为合适计算环境的例子,目的不在于暗示有关本发明用途或功能的任何限制。计算环境100不应该解释为对与在典型操作环境100中所示的任何一个组件或其组合有依赖性或需求性。
本发明可以在多种其它通用或专用计算系统环境或配置中运行。适用于本发明的熟知计算系统、环境和/或配置的例子包括,但不局限于,个人计算机、服务器计算机、手持或膝上设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费电子、网络PC、迷你计算机、巨型计算机、电话系统、包括上述系统或设备的任意组合的分布式计算环境、等等。
本发明可以用由计算机执行的计算机可执行指令的通用上下文来描述,例如程序模块。一般,程序模块包括线程、程序、对象、组件、数据结构、等等,它们执行特定的任务或实施特定抽象数据类型。本发明还可以在分布式计算环境中实施,在这种环境中,任务由通过通信网络连接的远程处理执行。在分布计算环境中,程序模块可以处在包括存储设备在内的本地及远程计算机存储介质中。
参考图1,实施本发明的典型系统包括计算机110形式的通用计算设备。计算机110的组件可以包括中央处理单元120、系统存储器130、和把包括该系统存储器在内的各种系统组件连接到处理单元120的系统总线121,但不限于此。
系统总线121可以是几种类型总线结构中的任意一种,包括存储器总线或存储器控制器、外设总线、和使用多种总线体系结构的任意一种的本地总线。作为例子,而非限制,此类体系结构包括工业标准结构(ISA)总线、微通道体系结构(MCA)总线、增强ISA(EISA)总线、视频电子标准协会(VESA)本地总线、和也称之为Mezzanine总线的外设组件互联(PCI)。
计算机110通常包括多种计算机可读介质。计算机可读介质可以是计算机110可以访问的任何可用介质,并包括易失和非易失性介质、可移动和不可移动介质。作为例子,但不是限制,计算机可读介质可以包括计算机存储介质和通信介质。计算机存储介质包括易失和非易失、可移动和不可移动介质,这些介质以存储诸如计算机可读指令、数据指令、程序模块或其它数据的信息的任何方法或技术来实施。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储技术、CD-ROM、数字多用盘(DVD)或其它光盘存储器、磁盒、磁带、磁盘存储器或其它磁性存储设备、或任何其它可以用来存储所需信息并可以由计算机110访问的介质。作为例子,非限制,通信介质包括诸如有线网络或直接有线连接的有线介质、和诸如声波、RF、红外线和其它无线介质的无线介质、上述任意介质的组合也应该包括在计算机可读介质的范围内。
系统存储器130包括诸如只读存储器(ROM)131和随机存取存储器(RAM)132形式的易失和/或非易失存储器。包含有助于例如在启动期间在计算机110内的单元之间传递信息的基本线程的基本输入/输出系统(BIOS)133通常存储在ROM 131中。RAM 132通常包括可立即被处理单元120访问的和/或当前正在操作于其上的数据和/或程序模块。作为例子,而非限制,图1显示有操作系统134、应用程序135、其它程序模块136、和程序数据137。
计算机110还可以包括其它可移动/不可移动易失/非易失计算机存储介质。仅仅作为例子,图1显示了从不可移动、非易失磁介质读写的硬盘驱动器141,从可移动、非易失磁盘152读写磁盘驱动器151,和从诸如CD-ROM或其它光介质的可移动、非易失光盘156读写的光盘驱动器155。其它可以用于示例性操作环境中的可移动/不可移动、易失/非易失计算机存储介质包括但不限于:磁带盒、闪存卡、数字多用盘、数字视频带、固态RAM、固态ROM、等等。硬盘驱动器141通常通过例如接口140的不可移动存储器接口连接到系统总线121,而磁盘驱动器151和光盘驱动器155通常通过例如接口150的可移动存储器接口连接到系统总线121。
上面所讨论并在图1中显示的驱动器及其相关计算机存储器介质为计算机110提供了计算机可读指令、数据结构、程序模块和其它数据的存储器。在图1中,例如,硬盘驱动器141用于存储操作系统144、应用程序145、其它程序模块146、和程序数据147。注意,这些组件既可以与操作系统134、应用程序135、其它程序模块136、和程序数据137相同也可以不同。操作系统134、应用程序135、其它程序模块136、和程序数据137在此被赋予不同的标号,至少显示它们是不同的拷贝。
用户可以通过例如键盘162、麦克风163、和诸如鼠标、跟踪球或触摸板的定位设备161等输入设备输入命令和信息到计算机110中。其它输入设备(未示出)可以包括游戏杆、游戏板、卫星盘、扫描仪、等。这些和其它输入设备通常是通过连接于系统总线的用户输入接口160连接到处理单元120的,但是也可以通过其它接口和总线结构来连接,例如并行端口、游戏端口或通用串行总线(USB)。监视器191或其它类型的显示设备也通过例如视频接口190的接口连接到系统总线121。除了监视器之外,计算机还可以包括例如扬声器197和打印机196的其它外围输入设备,它们可以通过输出外设接口190来连接。
计算110可以工作在使用到一个或多个例如远程计算机180的远程计算机的逻辑连接的组网环境中。远程计算机180可以是个人计算机、手持设备、服务器、路由器、网络PC、对等设备或其它公用网络节点,并通常包括与计算机110相关描述于上的许多个或所有元件。图1所描述的逻辑连接包括局域网(LAN)171和广域网(WAN)173,但还可以包括其它网络。这种组网环境在办公室、企业范围内的计算机网络、企业内部网和因特网中是很普遍的。
当用于LAN组网环境时,计算机110被通过网络接口或适配器170连接到LAN 171。当用于WAN组网环境时,计算机110通常包括用来在WAN 173(例如,因特网)上建立通信的调制解调器172或其它装置。调制解调器172,可以是内置的也可以是外置的,可以通过用户输入接口160或其它合适机制连接到系统总线121。在组网环境中,与计算机110相关描述的程序模块或其部分可存储在远程存储器存储设备中。作为例子,而非限制,图1显示有驻留于远程计算机180上的远程应用程序185。应该理解,所示网络连接是示例性的,并可以使用在计算机之间建立通信链路的其它手段。
图2是显示根据本发明一个方面的代码开发环境201的示意框图。该环境包括设计程序202和受控代码基础结构204。基础结构204示例被图示为—尽管并不必须是—一种包括但不限于由美国Washington州Redmond市的微软公司提供的现有.NET框架的环境的受控代码执行环境。
设计程序202是一种开发工具,尤其是与受控代码基础结构204联合运作以提供用于设计、构建、测试和部署应用程序的工具的编程环境。例证性的设计程序202为在由微软公司提供的VISUAL STUOIO.NET系列产品中的程序,尽管不是必须的。受控代码基础结构204示例性地包括配置成支持跨语言顺从代码的受控代码执行环境。根据一个实施例,基础结构204包括微软公司的.NET基础结构的公用语言运行时组件,其中,在这种情况下,设计程序202被配置成与受控代码基础结构204协作来产生至少部分地CLS顺从的代码。
根据本发明的一个方面,受控代码基础结构204和设计程序202一起提供了管理由受控代码基础结构204支持的语言的资源信息207的资源管理器。根据一个实施例,资源信息207包括与CLS顺从资源有关的信息。在图2内,资源管理器208和信息207显示为虚线框,其分离于程序202和基础结构204。这种布置目的在于反映这样的事实,即,精确实现对于本发明来说并不是关键。资源管理器和信息可以作为基础结构204的部分、作为程序202的部分、作为度量组件或其它形式来实现。
资源请求被通过多种已知的可接受方法的任何一种而传输到资源管理器208。根据一个实施例,资源示例性地通过“GetString(string KeyName)”方法来请求。例如,在设计时,开发人员与程序202接口,并创建包括对资源管理器208进行调用的代码,例如对作为资源信息207的部分而维持的CLS顺从组件的调用。所编码的资源调用示例性地包括与所需资源相关的字符串和键名的指示。基于所编码的资源调用,在过程的某一刻,使用“GetString(stringKeyName)”调用向资源管理器208做出相应字符串资源的请求。如果在设计时没能正确地输入字符串和/或键名(例如,在KeyName中的打字错误),那么直到运行时才能发现该错误的并不鲜见。另外,可以使用除了上述GetString方法之外的方法,而不会脱离本发明的范围。
根据本发明的一个方面,设计程序202包括总体上配置成用来在运行时之前减少或消除资源寻址错误的StringRes工具206。StringRes工具206被示例为补充设计程序202以便有助于更好地管理字符串资源的定制工具。根据一个实施例,StringRes工具206被作为设计程序202的一个组成部分。根据另一实施例,StringRes工具206是可以被集成在或安装到程序202中的升级。
根据一个实施例,假设设计程序202包括StringRes工具206,该工具自动与由开发人员使用设计程序202启动的任何编码项目相关联。然而,根据另一个实施例,只有当该工具被打开或在特定项目的上下文环境中安装时(即,该工具是有选择性地在项目基础上一一激活的),才能向开发人员提供工具206的功能性。
图3是屏幕视图300,表示的是设计程序202的界面的可能外观的一个例子。开发人员示例性地将代码输入到编码区域302。在平面视图300的具体上下文中,如由高亮标签304所指示的那样,开发人员正在协同指定为“Formal.cs”的文件创作代码。
提供有文件选择区域305以便开发人员能够在不同文件和不同项目之间移动。提供配置区域306以便开发人员能够至少有选择性地激活或去激活诸如StringRes工具206的各种编程工具。在屏幕视图300的具体上下文中,如在区域306内所指示的那样,StringRes工具已经协同“FROM1.RESX”文件激活。从而,当他或她在FROM1.RESX文件的上下文中输入代码时,向开发人员提供StringRes工具的功能性。根据一个实施例,该功能性还可以被扩展到具备与Form1.resx文件的预定层次关系的文件。因此,根据本发明的一个方面,StringRes工具是被实现为在需要时才激活的定制编程工具。为了描述本发明,将假设StringRes工具206还为“FROM1.CS”文件激活,其是在编码区域302中打开的文件。
以此存于脑海,根据本发明的一个方面,与StringRes工具相关联的子系统(例如,项目管理子系统)能够根据正在从事的项目所使用的特定CLR顺从语言进行响应。当有新文件添加到项目中,或现有的文件被修改时(例如,通过触及CustomTool属性),该文件的父文件被检查。父文件确定该项目是C#、C++、VB等等。基于该确定,代码以该项目的适当语言进行发布。以这种方式,一个设计程序方案可以包含多个项目,且StringRes工具可以容纳。
根据本发明一个方面,StringRes工具206提供给开发人员方便的设计时对资源地址/索引信息、以及可任选地对应于该目录资源的值的可用性。根据一个实施例,以显示在有助于开发人员完成语句和函数的弹出窗口和/或下拉列表中(例如,直接显示于设计程序界面内)的信息的形式提供对资源的访问。例如,对应于可用资源的标识符信息(即,键名、字符串和/或值信息)显示给开发人员以完成选择和语句。
根据一个实施例,有效资源信息是为特定资源参考而显示的。例如,在输入资源对象、命令或函数之后,激活器键启动对当前命令或函数有效值的下拉列表的显示。根据一个实施例,激活器键是一个句号(.)。根据其它实施例,激活器键是空格键、左(开)括号键、或一些其它键调用。根据一个实施例,通过下拉列表导航(即,滚动)或键输入,并在其中一个可用选择上停止(例如,预定的时量)键,能够在靠近下拉菜单弹出的窗口中显示附加的信息。
根据一个实施例,在设计程序界面上提供给开发人员能够使得他或她调整资源信息自动传送状态为自动、手动或无效的选项。当设定为自动时,在按压激活器键时,资源列表自动显示。当设置为手动时,在光标位于与信息的可用性相关联的位置时,开发人员可以选择性地激活资源信息的显示(例如,使用编辑菜单命令、快捷菜单选择、或CTRL-键组合)。根据一个实施例,与CLS顺从资源特别相关的信息通过作为StringRes工具206组件提供的所述设计程序界面更新来使得对于开发人员可用。
一般而言,StringRes工具206能够为资源标识符和相应信息的选择建立有效交叉参考,尤其是对于与CLS顺从资源相关的标识符和信息。因此,根据本发明的一个方面,当开发人员输入资源类并随后使用激活键时,就自动提供列表(例如,下拉菜单)来显示相关的可访问方法和属性。根据一个实施例,自动产生的列表是可用字符串键名的集合。根据另一个实施例,点亮其中一个键名则启动相关字符串值(例如,在弹出框内)的提供。
图4是表示设计程序202界面另一个例子的平面视图400。图4中的抓图基本上类似于图3的抓图,并且对于StringRes工具206被激活的假设仍然有效。在位置425处的编码区域内,开发人员已经键入“FROM11”,其示例为输入资源标识符的先趋符。在该先趋符之后,开发人员键入了句号(.),其示例为一个激活器键,该键以下拉菜单430的形式启动来自StringRes工具206的响应。菜单430示例性地包含对于相应先趋符输入条目有效的资源信息。
根据一个实施例,在下拉框中的信息以分层方式排列。例如,资源可以示例为基于多种语言可用,每种语言对应于作为与更宽资源单元相关的分层单元显示于该框中。当然,可以基于语言以外的其它任何因素来进行组织。应该注意,菜单430可以配置成包含多于所示的六种选择(例如,按字母顺序或其它排列可滚动的列表)。在菜单430中的所列的单元可以是—但不必是—对应于诸如CLS顺从单元的单元。
继续该例子,然后,开发人员通过菜单430进行导航并停在“MICHELLELOC”条目上。暂停于该条目之上示例性地启动相应弹出框436的出现,该框包含与从菜单430中选择的单元相关的字符串和/或值信息。最后,开发人员从菜单430选择其中一个条目。选择将使得资源键名、字符和/或值被自动插入到代码的合适位置中。
图5是显示与本发明实施例相关联的步骤的流程图。根据块502,向开发人员提供到CLS顺从资源的访问。根据步骤504,在代码开发期间,呈现给开发人员各自表示CLS顺从资源的资源标识符的集合。如步骤506所指示的那样,开发人员接着从该集合中选择表示所需CLS顺从资源的标识符。最后,根据步骤508,将相应的精确信息包括到开发人员的项目中。
根据本发明的另一方面,StringRes工具206提供对于构建时检查的支持来确定资源,尤其是CLS顺从资源是否因差错而寻址。该检查是通过比较在代码内的资源标识符和有效值的集合(例如,被维护以便支持所描述的设计时资源信息的提供的资源值的相同集合)来进行的。如果存在不匹配所存储值的资源值,就示例性地向开发人员报告错误以进行纠正。根据一个实施例,该系统配置成使得开发人员能够在需要时添加信息到有效值列表中,以配置该系统使其接受新的或不同资源输入。
根据一个实施例,参考图3的屏幕抓图,为了将资源工具扩展到新的资源信息,开发人员选择(例如,右击)在区域305方案浏览器内的项目。然后,开发人员可以启动把具有扩展名“.strings”的文件添加到项目文件。接着,根据需要添加新的字符串到.strings文件中。
根据一个更具体的实施例,为了添加新的资源信息,开发人员首先通过选择(即,右击)在方案区域305内的一个项目来引出功能选项菜单。然后,开发人员选择“添加新条目”功能以便产生对话框。接着,开发人员选择“资源”类目和字符串资源工具子类目以便向该项目添加具有“.strings”扩展名的文件。在方案浏览器中选择“显示所有文件”选项将示例性地展示该.strings文件具有两个子项目:一个“.cs”文件和一个“.resx”文件。示例性地,子文件不可以被直接编辑,因为它们是从.strings文件生成的。这些文件并不是在构建时生成,而是在每当存在对于.strings文件的改变、或对于.strings文件的定制工具或定制工具名空间属性的改变时才生成。
为了添加资源信息,开发人员只需将信息添加到.strings文件,例如,使用格式“<KeyName>=<value>”。该格式的一个例子是:
SimpleMsg=this is a simple message.
.strings文件的缺省文件名示例为STR1.strings,其在子文件“.cs”文件中产生以“STR1”命名的类(该类名来自文件名)。因此,例如,在C#编程环境中,下面的例子将是一个精确的例子:
STR1.SimpleMsg;//the string returned from this would be″This
is a simple message.″
使用字符串格式(string.format)的普通操作示例性地也由该工具来照顾。
例如:
FileNotFoundError(filename,description,int retries)=The
file{0}was not found because{1}.The number of retry attempts
was{2}.
不指定给定参数类型示例性地将该类型缺省为System.String(系统字符串)。在C#编程环境中,可应用的例子为:
STR1.FileNotFoundError(″myFile.abc″,″the file was deleted″,
30);//This would print:The file myFileabc.was not foundbecause
the file was deleted.The number of retry attempts was 30.
在.strings文件中的注释示例性地以井(pound)号(#)或分号(;)开头。标记为井号的注释示例性地从外部是看不到的,而那些由分号标记的通常是可用的。从外部看得到的注释被输出到.resx文件。示例性地,如果而且只有在该行中的第一字符是“#”或“;”时,StringRes工具才识别为有效注释行。
在.strings文件中的每个消息示例性地在自动产生的类中产生两个访问器(accessor)。一个用于“不确定语言的”和另一用于“指定语言的”。对于简单类型的消息,该访问器是一个字段。为了添加语言作为参数,要添加函数,并且稍稍改变其名称(例如,将“Loc”添加在字段名后)。对于采用参数的消息,名称不变;且只有参数列表改变(即,添加一CultureInfo参数)。对于自动产生的.cs文件的随意观察将显示细节。
添加到项目时,.strings文件示例性地会使定制工具属性设定为“StringRes”、定制工具名空间(Custom Tool Namespace)设定为空、构建动作(Build Action)设定为“none”(无)。用于StringRes的输出的名空间是从项目中获得的,但它可以示例性地通过将Custom Toll Namespace设定至所需的输出名空间而被忽视。
设计程序识别StringRes工具作为定制工具(Custom Tool)的方式示例性地是通过在方案浏览器中具有客户工具属性设为StringRes的的文件而进行的。因此,只要客户工具属性被设为StringRes并且文件处于有效格式中,那么添加.txt或.abc文件就好了(即,在C#项目中)。
在产品中部署了与文化无关的资源之后,示例性地,loc资源可以在任何时进行部署,而无需对二元(binary)有任何触及;并且不需要重新构建。如果字符串资源被请求,而在运行时不可用,那么就示例性地遍历该资源的层次体系,并将该体系的根作为与文化无关的资源集。因此,如果请求了一个日语字符串,但是不可用,那么就返回英语字符串。如果后来日语资源集变得可用了,那么就返回日语字符串。
作为例子,考虑以下场景:
1)AppX使用嵌入在可执行AppX中的字符串资源;
2)六个星期之后,在奥地利突然产生了对AppX的兴趣,奥地利-德语在System.Localization.CultureInfo类中为“de-At”;
3)在AppX的可执行目录中,创建“de-At”的子目录以及为标准德语创建的子目录“de”;
4)奥地利-德语的loc卖主迟到,但是标准德语中的局部化资源及时被接收到;
5)局部化资源被放入“de”子目录中,其中loc资源仍运行,而AppX是热放的(dropped hot)(例如,不必重新开始该业务);
6)对于“de-At”字符串的请求被用“de”字符串返回;和
7)在后面的某个日子,当“de-At”资源被放下时,就返回它们。
根据一个实施例,StringRes工具配置成管理多个字符串,其表示被以某种形式提供给用户(例如,在下拉列表框内)。该工具提供了自动完成功能,其中当用户选择了StringRes正在管理的其中一个条目时(例如,从下拉框中选择),该字符串的值就以某种形式提供给用户(例如,在弹出框内)。
例如,考虑StringRes工具管理包括“mystring=this is my string”在内的STR1.strings的情形。如果,在设计程序界面内,用户在合适的位置键入STR1(例如,作为VisualStudio.net IDE),那么将显示相应选项的列表(例如,在下拉列表框内)。如果用户从选项列表中选择了myString,那么该工具将报告相应的值(例如,“this is my string”)。根据一个实施例,该值被报告于气球或弹出框内。因此,用户能够在设计时获得所寻址的字符串的**值**。
在此所描述的方法一般减少或消除了资源寻址的错误,从而防止了将错误引入到应用程序中。在设计时提供资源的值,尤其是CLS顺从资源的值,增强了代码开发的生产率和精确性。
本说明书包括有关如何特别地添加字符串到.strings文件的解释。根据本发明的一个方面,StringRes工具还可处理标准文件(例如,标准.resx文件)。根据一个实施例,当字符串定义被通过StringRes工具功能性而添加到可用的定义中时,所需的只是名称/值对(例如,“mystring=this is my string”)。
虽然本发明是参考特定实施例进行了描述,但是本领域熟练人员将认识到,在不脱离本发明精神和范围的情况下,可以在形式和细节上做出变化。