Visual Studio插件开发- EnvDTE的使用

最近在做Visual Studio项目和项模板需要用到一些EnvDTE的技术,把相关代码拿出来和大家分享一下


首先是获取Visual Studio实例

在仅打开了一个实例的情况下,用GetActiveInstance即可,

在打开了多个实例的情况下,可以用另外一个函数获得所有实例


这里有一个问题,如果打开了多个Visual Studio,如何知道当前正在操作的Visual Studio实例?

答案令人失望,没有什么好办法。 如果有人知道可以分享一下。


有一个变通的办法,通过打开的解决方案的名称来区分,即通过Solution Name来找到某一个VS的实例。当然,前提是要知道这个Solution的名字,于是又陷入了死循环。


然后就是找到一个特定的项目(需要传入项目特征字符或者完整名称)

然后把文件或者引用加到项目中

[csharp]  view plain copy
  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Linq;  
  4. using System.Text;  
  5. using System.Threading.Tasks;  
  6. using System.Runtime.InteropServices;  
  7. using System.Runtime.InteropServices.ComTypes;  
  8. using EnvDTE;  
  9. using EnvDTE80;  
  10. using VSLangProj;  
  11.   
  12. namespace Template.AddNewItemWizard  
  13. {  
  14.     class EnvDTEHelper  
  15.     {  
  16.   
  17.         public static void AddFilesToProject(string projectName, List<string> files)  
  18.         {  
  19.             try  
  20.             {  
  21.                 DTE dte = GetIntegrityServiceInstance();  
  22.                 if (dte != null)  
  23.                 {  
  24.                     foreach (EnvDTE.Project item in dte.Solution.Projects)  
  25.                     {  
  26.                         if (item.Name.Contains(projectName))  
  27.                         {  
  28.                             foreach (string file in files)  
  29.                                 item.ProjectItems.AddFromFile(file);  
  30.                             item.Save();  
  31.                         }  
  32.                     }  
  33.                 }  
  34.             }  
  35.             finally  
  36.             {  
  37.             }  
  38.         }  
  39.   
  40.         public static void AddProjectReferences(string projectName, Dictionary<stringstring> references)  
  41.         {  
  42.             try  
  43.             {  
  44.                 DTE dte = GetIntegrityServiceInstance();  
  45.                 if (dte != null)  
  46.                 {  
  47.                     foreach (EnvDTE.Project item in dte.Solution.Projects)  
  48.                     {  
  49.                         if (item.Name.Contains(projectName))  
  50.                         {  
  51.                             VSProject vsProject = (VSProject)item.Object;  
  52.                             foreach (KeyValuePair<stringstring> reference in references)  
  53.                             {  
  54.                                 if (vsProject.References.Find(reference.Key) == null)  
  55.                                 {  
  56.                                     vsProject.References.Add(reference.Value);  
  57.                                 }  
  58.                             }  
  59.                             item.Save();  
  60.                         }  
  61.                     }  
  62.                 }  
  63.             }  
  64.             finally  
  65.             {  
  66.             }  
  67.         }  
  68.   
  69.         private static DTE GetIntegrityServiceInstance()  
  70.         {  
  71.             List<string> projectNames = new List<string>();  
  72.             IEnumerable<DTE> dtes = GetAllInstances();  
  73.             if (dtes.Count() == 1)  
  74.                 return dtes.First();  
  75.             foreach (DTE dte in GetAllInstances())  
  76.             {  
  77.                 projectNames.Clear();  
  78.                 foreach (Project project in dte.Solution.Projects)  
  79.                 {  
  80.                     projectNames.Add(project.Name);  
  81.                 }  
  82.                 if ((projectNames.Contains("Service")) && (projectNames.Contains("NUnit")))  
  83.                     return dte;  
  84.             }  
  85.             return null;  
  86.         }  
  87.   
  88.         private static DTE2 GetActiveInstance()  
  89.         {  
  90.             return (EnvDTE80.DTE2)Marshal.GetActiveObject("VisualStudio.DTE.11.0");  
  91.         }  
  92.   
  93.         private static IEnumerable<DTE> GetAllInstances()  
  94.         {  
  95.             IRunningObjectTable rot;  
  96.             IEnumMoniker enumMoniker;  
  97.             int retVal = GetRunningObjectTable(0, out rot);  
  98.   
  99.             if (retVal == 0)  
  100.             {  
  101.                 rot.EnumRunning(out enumMoniker);  
  102.   
  103.                 IntPtr fetched = IntPtr.Zero;  
  104.                 IMoniker[] moniker = new IMoniker[1];  
  105.                 object punkObject = null;  
  106.                 while (enumMoniker.Next(1, moniker, fetched) == 0)  
  107.                 {  
  108.                     IBindCtx bindCtx;  
  109.                     CreateBindCtx(0, out bindCtx);  
  110.                     string displayName;  
  111.                     moniker[0].GetDisplayName(bindCtx, nullout displayName);  
  112.                    // Console.WriteLine("Display Name: {0}", displayName);  
  113.                     bool isVisualStudio = displayName.StartsWith("!VisualStudio");  
  114.                     if (isVisualStudio)  
  115.                     {  
  116.                         //var dte = rot.GetObject(moniker) as DTE;  
  117.                         //yield return dte;  
  118.                         rot.GetObject(moniker[0], out punkObject);  
  119.                         var dte = (DTE)(punkObject);  
  120.                         yield return dte;  
  121.                     }  
  122.                 }  
  123.             }  
  124.         }  
  125.   
  126.         [DllImport("ole32.dll")]  
  127.         private static extern void CreateBindCtx(int reserved, out IBindCtx ppbc);  
  128.   
  129.         [DllImport("ole32.dll")]  
  130.         private static extern int GetRunningObjectTable(int reserved, out IRunningObjectTable prot);  
  131.     }  
  132. }  

原文地址:
http://blog.csdn.net/whw6_faye/article/details/18180945

你可能感兴趣的:(vs开发)