ASP.NET 2.0里提供的几个Starter Kits fot VS2005,于是有人MSN问,几个Starter Kits应用程序均以“.VSI”扩展名的文件提供,这是个什么样的扩展名?为什么我们可以直接安装,并可以把Starter Kits应用程序项目直接嵌入VS2005中的新建项目模版里?
确实是个有趣的问题。VSI,如果我没理解错的话,应该是Visual Studio Installer的缩写。那么,.VSI文件到底如何实现在VS2005里嵌入项目模版的呢?这个要从VS2005提供的“Export Template”说起了。Export Template项在File菜单里。我们动手从一个例子看起吧。
1、新建一个ASP.NET Web Site。并编写你打算作为日后模版项目里固有功能的代码,也可以放置任何文件夹和文件,比如图片等。这个Web Site在后面将成为VS2005里的一个项目模版,类似Starter Kits里的那几个示例。下面是演示项目的一张图片,供一会与利用该模版新建的项目对比,看是否完全一致。
2、保存项目。然后在File菜单中选择“Export Template”,弹出如下对话框。我们选择第一项“Project template”。最下面的模版类型选择“Visual C#”,表示创建的是C#的ASP.NET Web Site模版。当然你可以依照你喜好选择VB.NET。
3、选择下一步Next。进一步设置模版图标、模版名称、说明等。这些基本属性信息将作在VS2005里显示给用户看。
4、按“Finish”结束导出过程。同时如果你选择“自动嵌入Vs2005”,按Finish后,你在新建WebSite项目的窗口里,就可以看到你刚才所创建的项目模版,如下图。如果你选择最下面的“Display an explorer......”还会自动帮你打开输出目录。在选择利用这个WebSite1项目模版创建的项目,将自动包含第一张图里所列的所有文件夹和文件和所有代码等,即完全是第一张图项目的克隆版本。
至此,完成了Starter Kits里最终一样的效果。但是.VSI的疑问还是没有解开。别急,其实我们已经快解开这个VSI疑团了。现在,进一步再看刚才我们导出的项目模版文件WebSite1.zip,默认在C:\Documents and Settings\Administrator\My Documents\Visual Studio 2005\My Exported Templates目录下。我们发现刚才导出的文件居然是个.ZIP的压缩文件,于是很自然想到解压缩看下里面有些什么东西。解压缩后发现除了原本项目里所有的文件夹和文件外,还多了一个模版图标__TemplateIcon.ico和一个名为MyTemplate.vstemplate的文件。利用记事本打开MyTemplate.vstemplate,里面内容为一份描述这个项目模版信息的XML数据文档。(文档内容略)。
正是这份XML文档让我有了一个想法,即利用UltraEdit打开StarterKits里的TimeTracker.VSI文件察看内部结构,发现果然是个ZIP压缩包文件。于是将StarterKits里的TimeTracker.vsi改名为TimeTracker.ZIP,顺利对TimeTracker.ZIP进行解压缩。TimerTracker压缩包里除了一个跟我们上面制作过程一样格式的ZIP文件外,还包含了一个TimeTracker.vscontent的文件。再用记事本打开这个vscontent文件,真相大白:
<?xml version="1.0" encoding="utf-8" ?> <VSContent xmlns="http://schemas.microsoft.com/developer/vscontent/2005"> <Content> <FileName>TimeTrackerCS.zip</FileName> <DisplayName>Time Tracker Starter Kit (C#)</DisplayName> <Description>Starter Kit for Web project (General category)</Description> <FileContentType>VSTemplate</FileContentType> <ContentVersion>1.0</ContentVersion> <Attributes> <Attribute name="TemplateType" value="Project"></Attribute> <Attribute name="ProjectType" value="Visual Web Developer"></Attribute> <Attribute name="ProjectSubType" value="CSharp"></Attribute> </Attributes> </Content></VSContent>
原来.VSI文件内部只有两个文件:一份用于描述文件信息的XML文件和一个利用Export Template导出的ZIP压缩包。
了解了VSI内部结构后,我把TimeTracker.vscontent里的这份XML文件信息更改为描述WebSite1的信息,主要把FileName改为WebSite1.zip,然后顺便把TimeTracker.vscontent也更名为WebSite1.vscontent,然后压缩WebSite1.vscontent和WebSite1.zip文件为一个新的WebSite1.zip(注意只有ZIP压缩文件才被接受),最后把新生成的WebSite1.zip更名为WebSite1.vsi。然后双击WebSite1.vsi,其安装过程和结果完全与StarterKits里的示例一致。至此,VSI疑团告破。
认真想一下这个模版输出功能,确实大有用处。程序员之间可以利用VSI文件进行真正便捷、可配置的代码交流;也可以利用项目模版创建一系列公用的应用程序模版。相信,不久的将来,大部分.NET社区或网站提供的.NET代码示例都会采用类似Starter Kits的做法,也相信大家的代码程序交流将会更加倾向于这种VSI文件之间的交换。
再补充一下:呵呵,发表了以后,再去google查了相关资料。才发现.vsi扩展名文件的安装,其实质是调用C:\Program Files\Common Files\Microsoft Shared\MSEnv目录下的VSContentInstaller.exe进行安装的。所以如果你出现不能直接双击安装.vsi的错误时,可以利用这个命令行文件进行安装。但是我还没有找到可以用来打包生成vsi的工具程序。但根据查阅的资料显示,利用Microsoft.VisualStudio.VSContentInstaller.dll(与VSContentInstaller.exe同目录)里提供的接口似乎可以自己编写程序创建一个vsi打包工具,但尚未经过实际验证,有空再试试。