Visual Studio 2008 可扩展性开发(五):操作Solution、Project和ProjectItem

简介:

前言

说真的,前面几篇随笔读起来会很乏味,写起来更是如此。不过好戏总在后头,从这一篇开始我将介绍在Add-In中对VS的各个元素进行操作,这些会有意思得多。

大多数时候,我们在VS中进行开发,都是从打开解决方案开始,然后找到项目、打开文件进行开发。本文将介绍与此相关的内容。

解决方案、项目和项简介

我相信,这三者对我们.NET开发人员来说是再熟悉不过的了。但它们在AOM(自动化对象模型)的表示方式跟我们想象的会不太一样。看下面的图1,其中涉及的主要元素有解决方案、解决方案文件夹、项目、文件夹、文件。AOM通过Solution接口表示解决方案;Project接口表示解决方案文件夹和项目;ProjectItem接口表示文件夹和文件。下面我会通过一个例子来介绍它们。

简单的代码生成器  

在实际开发中,我们往往需要采用一些特定的技术方案,这些方案就决定了程序的整体架构,表现在程序中就是一些项目、程序集、配置文件的组织。曾经有段时间很喜欢iBATIS.NET,这里就以它的示例项目NPetshop为例进行演示。NPetshop的基本结构如下:

npetshop-arch

图1:NPetshop的程序结构

它的代码可以在NPetshop Source for .NET 2.0一文中找到。External-bin里面是所需要的各个程序集,Domain是实体类,Persistence是数据访问层,Service是业务逻辑层,Presentation是表现逻辑层,Web则负责最终的表现。如果要采用这样的解决方案进行开发,那么在项目开始我们就得花些时间来搭建整个解决方案的框架。通过Add-In,我们可以做到“一次编写,多次使用”。

现在来看看如何从零开始创建一个解决方案。在本例中,大致过程是:

npetshop

图2:解决方案创建过程

下面就来一步步实现。

0)添加命令

在之前的随笔已经向NEnhancer添加了两个命令了,现在需要添加新的命令,这样重复代码又得多一些了,所以在添加命令之前,先将代码重构一下,提取出几个小方法:

C# Code - Connect类的辅助方法


有了这些方法,再添加命令就变得更简单:

C# Code - 添加命令


1)创建解决方案
 

唯一需要用户输入的信息是解决方案的名称(这里假定各项目的名称都以此为前缀)和目录,这需要创建一个简单的窗体(NPetshopSlnGenerator)来收集信息。

npetshop-form

图3:Generator窗体

在AOM中,表示解决方案的类型是EnvDTE.Solution(以及其后续版本Solution2、Solution3),它的重要方法和属性有:

  • AddFromFile():添加既有项目;
  • AddFromTemplate():根据指定项目模板添加新的项目;
  • AddSolutionFolder():添加解决方案文件夹;
  • Close():关闭解决方案;
  • Create():创建一个空的解决方案;
  • Open():打开一个解决方案;
  • Remove():移除一个项目;
  • SaveAs():保存解决方案;
  • FileName:解决方案文件名;
  • FullName:解决方案文件全名;
  • IsOpen:表示解决方案是否已打开;
  • Projects:解决方案内的项目集合;
  • SolutionBuild:用于管理解决方案的Build过程。

Solution的完整成员列表请参看MSDN。要访问VS中的当前解决方案,可使用DTE.Solution属性,下面是创建解决方案的代码:

C# Code - 创建解决方案
Solution3 sln = (DTEObject.Solution as Solution3);
sln.Create(currentSlnPath, slnName);


一旦调用了Create方法,VS就会打开新创建的解决方案。

2)创建解决方案文件夹

在这一步,首先要把所需的程序集等文件拷贝到新解决方案所在目录,然后创建解决方案文件夹,将文件添加进去:

复制代码
C# Code - 创建SolutionFolder
Project sfProj = sln.AddSolutionFolder(ExternalBinDirectoryName);
foreach (string file in Directory.GetFiles(ExternalBinPath))
{
    sfProj.ProjectItems.AddFromFile(file);
}
复制代码


很简单,就是调用AddSolutionFolder方法。可以看到,解决方案文件夹被看作是一种Project,通过其ProjectItems添加文件(关于Project的更多内容请看下面)。

3)创建各个项目

由于项目之间会有依赖关系,所以考虑按依赖关系进行创建,也就是Domain->Persistence->Service->Presentation->Web。

表示项目的类型为EnvDTE.Project,它的主要方法和属性有:

  • Delete():将项目从解决方案内移除;
  • Save():保存项目;
  • SaveAs():保存解决方案、项目和文件项;
  • FileName/FullName:项目文件的名称/全名;
  • Kind:表示项目类型的GUID值;
  • ProjectItems:项目所包含的项的集合;

Project的完整成员列表请参看MSDN。创建Domain项目的代码大致如下:

复制代码
C# Code - 创建项目
string classLibProjTemplatePath =
    sln.GetProjectTemplate(
"ClassLibrary.zip""CSharp");
string domainProjName = slnName + "." + "Domain";
sln.AddFromTemplate(classLibProjTemplatePath, Path.Combine(currentSlnPath, domainProjName),
    domainProjName, 
false);
Project domainProj 
= GetProjectByName(sln, domainProjName);
VSProject vsDomainProj 
= domainProj.Object as VSProject;
vsDomainProj.References.Add(Path.Combine(ExternalBinPath, 
"IBatisNet.Common.dll"));
复制代码


Domain是类库项目,它有对应的项目模板,此时可以使用Solution.GetProjectTemplate方法获取模板路径,然后使用AddFromTemplate方法添加项目。本来AddFromTemplate方法返回一个Project对象,按道理应该就是新创建的项目,但是MSDN上说对于C#和VB.NET项目来说,返回值为null!只好自己写一个方法GetProjectByName了,也就是循环各个项目,根据名称找到匹配的项目。最后,要给Domain项目添加对IBatisNet.Common.dll的引用,这里要使用VSProject的References集合来添加。

接下来是Persistence项目,过程与Domain基本相同,但是要给它添加对Domain项目的引用,此时应使用References.AddProject方法:

C# Code - 添加项目引用
vsPersistProj.References.AddProject(domainProj);


照这样下去,剩下的Service、Presentation、Web项目也可以顺利创建,只是在创建Web项目的时候要用WebApplication项目模板:Solution.GetProjectTemplate("WebApplicationProject.zip", "CSharp")。

4)创建文件夹和文件

在AOM中,文件夹和文件统一表示为ProjectItem类型。它的主要方法和属性为:

  • Delete():从项目中删除该项;
  • ExpandView():展开解决方案管理器来显示该项;
  • Open():打开该项;
  • Remove():从该项所包含的项中移除一项;
  • Save()/Save():保存
  • Kind:该项的类型;
  • Name:该项的名称;
  • ProjectItems:该项所包含的其它项;

ProjectItem的完整成员列表请参看MSDN。Project接口有一个ProjectItems集合属性,可以访问项目所包含的项,同时该属性还可用来添加新的项。在本例中,要添加几个文件夹和文件:

C# Code - 添加文件夹和已有文件
webProj.ProjectItems.AddFolder("Maps", Constants.vsProjectItemKindPhysicalFolder);
webProj.ProjectItems.AddFromFileCopy(
    Path.Combine(GetAddinPath(), 
@"ibatis-config\dao.config"));


这里使用了AddFolder和AddFromFileCopy方法。如果需要添加新的文件,也很简单,类似于项目,这里要使用项模板:

C# Code - 根据模板添加文件
string templatePath =
    sln.GetProjectItemTemplate(
"Interface.zip""CSharp");
webProj.ProjectItems.AddFromTemplate(templatePath, 
"MyInterface.cs");


关于ProjectItems的更多信息请参看这里。至此我们就完成了一个具备初步功能的代码生成器。

文中示例的代码可以从这里下载

我们身在何处?

在VS中,解决方案、项目和文件(夹)是其基本组织形式,也是我们开发人员最为熟悉的元素了,本文介绍的就是与此相关的基本操作。这些操作是通过开发一个具备初步功能的代码生成器来演示的,其中可以了解如何从解决方案开始,自上而下逐步生成项目、文件夹和文件。但是需要说明的是,这里没有对Solution Explorer的操作,也没有涉及到对文件内容的操作,这些都将在后续的随笔中介绍。

参考 

《Professional Visual Studio® 2008 Extensibility》
《Working with Microsoft Visual Studio® 2005》



本文转自一个程序员的自省博客园博客,原文链接:http://www.cnblogs.com/anderslly/archive/2009/03/15/vs-addin-solution-project.html,如需转载请自行联系原作者。
目录
相关文章
Visual Studio Code开发常用的工具栏选项,查看源码技巧以及【vscode常用的快捷键】
Visual Studio Code开发常用的工具栏选项,查看源码技巧以及【vscode常用的快捷键】
610 0
|
4月前
|
NoSQL 编译器 C语言
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。
C语言调试是开发中的重要技能,涵盖基本技巧如打印输出、断点调试和单步执行,以及使用GCC、GDB、Visual Studio和Eclipse CDT等工具。高级技巧包括内存检查、性能分析和符号调试。通过实践案例学习如何有效定位和解决问题,同时注意保持耐心、合理利用工具、记录过程并避免过度调试,以提高编程能力和开发效率。
78 1
|
5月前
|
前端开发 JavaScript C#
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
CodeMaid:一款基于.NET开发的Visual Studio代码简化和整理实用插件
113 0
|
6月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
8月前
|
C++ Windows
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
在Windows上使用Visual Studio 2022进行FFmpeg和SDL2集成开发,首先安装FFmpeg至E:\msys64\usr\local\ffmpeg,然后新建C++控制台项目。在项目属性中,添加FFmpeg和SDL2的头文件及库文件目录。接着配置链接器的附加依赖项,包括多个FFmpeg及SDL2的lib文件。在代码中引入FFmpeg的`av_log`函数输出"Hello World",编译并运行,若看到"Hello World",即表示集成成功。详细步骤可参考《FFmpeg开发实战:从零基础到短视频上线》。
334 0
FFmpeg开发笔记(三十九)给Visual Studio的C++工程集成FFmpeg
|
8月前
|
人工智能 前端开发 Devops
NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。
【7月更文挑战第4天】**.NET技术在现代开发中的影响力日益增强,本文聚焦其核心价值,如多语言支持、强大的Visual Studio工具、丰富的类库和跨平台能力。实际应用涵盖企业系统、Web、移动和游戏开发,以及云服务。面对性能挑战、容器化、AI集成及跨平台竞争,.NET持续创新,开发者应关注技术趋势,提升技能,并参与社区,共同推进技术发展。**
69 1
使用 Visual Studio 开发 CS 的 BOF
使用 Visual Studio 开发 CS 的 BOF
|
前端开发 JavaScript PHP
Visual Studio Code的使用心得与常用免费插件使用技巧大全总结 老板夸奖我是开发小能手!
这就是我一直在使用的免费代码编辑神器, 它的优点太多了, 有: 智能感知、代码调试、内置 Git 命令、可扩展和可定制都相当牛,最关键的是免费开源!!
440 3
Visual Studio Code的使用心得与常用免费插件使用技巧大全总结 老板夸奖我是开发小能手!
|
Web App开发 JavaScript 前端开发
Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】
Visual Studio Code 常见的配置、常用好用插件以及【vsCode 开发相应项目推荐安装的插件】
389 0
|
开发框架 .NET 数据库
asp.net企业费用报销管理信息系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio
asp.net 企业费用报销管理信息系统是一套完善的web设计管理系统,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为vs2010,数据库为sqlserver2008,使 用c#语言开发 应用技术:asp.net c#+sqlserver 开发工具:vs2010 +sqlserver
127 0

热门文章

最新文章