代码改变世界

VS2008 AddIn 操作DTE2

2010-06-16 01:00  轩脉刃  阅读(1402)  评论(0编辑  收藏  举报

  在VS2008扩展开发中,最重要的就是DTE对象。DTE对象提供了对扩展性模型中其他对象的访问。DTE是VS自动化模型中的顶级对象。

  在按照http://www.cnblogs.com/yjf512/archive/2010/06/05/1752401.html中描述的创建VS AddIn插件后,能在Connect类中找到private DTE2 _applicationObject这个属性,对文件的各项操作就是从这个DTE2属性中开始:

以下方法可以在Exec方法中引用:

 

如何使用DTE2打开一个解决方案:

 

代码
private void OpenSolution(string solutionFullName, DTE2 _applicationObject)
{
try
{
((DTE2)_applicationObject).Solution.Open(solutionFullName);
}
catch (Exception ex)
{
throw;
}
}

 

 

取得当前解决方案中的所有方法:

(其中包含了对Project的操作、对FileCodeModel的操作,对codeElement的操作)

 

代码
private CodeFunction2[] GetAllFunctionInCurrentCode(DTE2 _applicationObject)
{
List
<CodeFunction2> codeFuncs = new List<CodeFunction2>();

int projectCount = _applicationObject.Solution.Projects.Count;
try
{
for (int i = 0; i < projectCount; i++)
{
Project project
= _applicationObject.Solution.Projects.Item(i + 1);
foreach (ProjectItem vsproject in project.ProjectItems)
{
if (vsproject.Name.Contains(".cs"))
{
FileCodeModel2 CM
= (FileCodeModel2)vsproject.FileCodeModel;
foreach (CodeElement2 codeElement in CM.CodeElements)
{
if (codeElement.Kind == vsCMElement.vsCMElementNamespace)
{
CodeElement2 eleTemp
= codeElement;
Queue
<CodeElement2> childElements = new Queue<CodeElement2>();
childElements.Enqueue(eleTemp);
while (childElements.Count != 0)
{
CodeElement2 topEle
= childElements.Dequeue();
if (topEle.Kind == vsCMElement.vsCMElementFunction)
codeFuncs.Add((CodeFunction2)topEle);
if (topEle.Children != null)
{
foreach (CodeElement2 childrenItem in topEle.Children)
{
childElements.Enqueue(childrenItem);
}
}
}
}
}
}
}
}
}
catch (Exception ex)
{
throw;
}
return codeFuncs.ToArray();
}