您现在的位置: 天下网吧 >> 网吧天地 >> 天下码农 >> 微信小程序 >> 正文

VS.NET 2003集成环境插件开发指南(三)----操纵VS开发环境(完结篇)

2010-12-28vczx佚名

一、             操纵VS开发环境

VS.NET自动化模型涉及的面太广,本文只针对一些专题加以说明。

1、   利用代码模型浏览代码

l          获取代码模型对象

//获取当前正活动的文档

     Document activeDocument = applicationObject.ActiveDocument;

     if(activeDocument != null)

     {

         ProjectItem projectItem = activeDocument.ProjectItem;

         if(projectItem != null)

         {

              FileCodeModel fileCodeModel = projectItem.FileCodeModel;

              if(fileCodeModel != null)

              {

                   CodeElements codeElements = fileCodeModel.CodeElements;

                   if(codeElements != null)

                   {

                       foreach(CodeElement ce in codeElements)

                       {

                            result.AddRange(getCodeElements(ce));

                       }

                   }

              }

          }

}

说明:

上面的代码先从DTE对象(也即VS自动模型的根对象)获得当前正活动的文档对象

然后再根据文档对象获取和它关联的项目元素,这里的ProjectItem其实就是在解决方案资源管理器下面的项目文件夹对应的子项。可以是各种类型,如文件,文件夹等

再从项目元素获得关联的文件代码模型

根据文件代码模型获取其代码元素的集合CodeElementCollection,代码元素的父类为CodeElement,下面派生出许多的子类,代表具体的代码元素,分别有:

CodeNamespaceCodeClassCodeInterfaceCodeFunction

CodePropertyCodeVariableCodeDelegateCodeStructCodeEnum

代表着命名空间、类、接口、函数、属性、变量、委托、结构、枚举等类型的代码元素,某个CodeElement具体是何类型,可以根据CodeElement. vsCMElement枚举类型来判断,然后再显式转换成具体的子类即可

但是更进一步的代码元素,如函数体内的语句,好像还没有看到有方法检索。不过也可以利用一些其它的方法,比如CodeRush的程序集里面提供了一个StructuralParser程序集,用于C#的代码分析。如果谁有兴趣可以研究研究

 

l          根据具体类型检索代码元素(不再多做解释了):

         private ArrayList getCodeElements(CodeElement baseElement)

         {

              ArrayList result = new ArrayList();           

 

              switch(baseElement.Kind)

              {

                   case vsCMElement.vsCMElementNamespace:

                       CodeNamespace cn = (CodeNamespace) baseElement;

                       foreach(CodeElement element in cn.Members)

                       {

                            result.AddRange(getCodeElements(element));

                       }

                       break;

                   case vsCMElement.vsCMElementClass:            

                       CodeClass cc = (CodeClass) baseElement;

                       foreach(CodeElement element in cc.Members)

                       {

                            result.AddRange(getCodeElements(element));

                       }

                       break;

                   case vsCMElement.vsCMElementInterface:

                       CodeInterface ci = (CodeInterface) baseElement;

                       foreach(CodeElement element in ci.Members)

                       {

                            result.AddRange(getCodeElements(element));

                       }

                       break;

                   case vsCMElement.vsCMElementFunction:

                       result.Add(baseElement);

                       break;

                   case vsCMElement.vsCMElementProperty:

                       {

                            result.Add(baseElement);

                       }

                       break;

                   case vsCMElement.vsCMElementEvent:

                       {

                            result.Add(baseElement);

                       }

                       break;

                   case vsCMElement.vsCMElementDelegate:

                       {

                            result.Add(baseElement);

                       }

                       break;

                   case vsCMElement.vsCMElementStruct:

                       {

                            result.Add(baseElement);

                            CodeStruct cs = (CodeStruct) baseElement;

                            foreach(CodeElement element in cs.Members)

                            {

                                 result.AddRange(getCodeElements(element));

                            }

                       }

                       break;

                   case vsCMElement.vsCMElementEnum:

                       {

                            result.Add(baseElement);

                       }

                       break;

                   case vsCMElement.vsCMElementAttribute:

                       result.Add(baseElement);

                       break;

                   case vsCMElement.vsCMElementUsingStmt:

                       result.Add(baseElement);

                       break;

                   case vsCMElement.vsCMElementVariable:

                       result.Add(baseElement);

                       break;

 

              }

              return result;

         }

 

2、   操纵解决方案及其项目文档

l          获取当前被选中的项目

下面代码演示了鼠标点击一个项目,或项目中的子项时,如何得到该项目对象

public Project GetSelectedProject()

{

     Project project = null;

     //从被选中对象中获取工程对象

     EnvDTE.SelectedItem item = Application.SelectedItems.Item(1);

 

     if(item.Project != null)

     {//被选中的就是项目本生

         project = item.Project;

     }

     else

     {//被选中的是项目下的子项

         project = item.ProjectItem.ProjectItems.ContainingProject;

     }

     return project;

}

 

l          获取当前项目的所在目录

private string GetSelectedProjectPath()

{

         string path = "";

         //获取被选中的工程

         Project project = GetSelectedProject();

         if(project != null)

         {

                   //全名包括*.csproj这样的文件命

                   path = project.FullName;

         }

         //去掉工程的文件名

         path = Path.GetDirectoryName(path);

         return path;

}

 

l          将文件加入工程中

//获取被选中的工程

Project project = this.GetSelectedProject();

//将文件夹下的文件加入工程

project.ProjectItems.AddFromDirectory(sdir);

//将单个文件加入工程

project.ProjectItems.AddFromFile(nfile);

 

 

l          向项目中加入程序集引用

using VSLangProj;

 

private void AddReference(string assembly)

{

         Project project = GetSelectedProject();

         VSProject vsproject = null;

         if (project.Kind == PrjKind.prjKindCSharpProject)

         {

                   //工程类型为C#工程,projectObject成员转换为VSProject对象

                   vsproject = project.Object as VSProject;

         }

         if(vsproject != null)

         {

                  //获取C#工程的引用集

                   VSLangProj.References refers = vsproject.References;

                   if(refers != null)

                   {

                            //将程序集引用添加到工程中

                            refers.Add(assembly);

                   }

         }

}

 

3、   在代码编辑窗口操纵代码

这里不再详述,只是列出网上的资源,大家可以自行参考

 

二、             参考资料

http://www.knowdotnet.com/add-insmacros.html

msdn帮助目录:Visual Studio .NET-->使用 Visual Studio .NET 进行开发-->参考-->自动化与扩展性参考-->公共环境对象模型

欢迎访问最专业的网吧论坛,无盘论坛,网吧经营,网咖管理,网吧专业论坛 https://bbs.txwb.com

关注天下网吧微信/下载天下网吧APP/天下网吧小程序,一起来超精彩

本文来源:vczx 作者:佚名

声明
声明:本站所发表的文章、评论及图片仅代表作者本人观点,与本站立场无关。若文章侵犯了您的相关权益,请及时与我们联系,我们会及时处理,感谢您对本站的支持!联系邮箱:support@txwb.com,系统开号,技术支持,服务联系QQ:1175525021本站所有有注明来源为天下网吧或天下网吧论坛的原创作品,各位转载时请注明来源链接!
天下网吧 网吧天下