428 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			428 lines
		
	
	
		
			16 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Reflection;
 | |
| using System.Windows.Forms;
 | |
| using System.Runtime.InteropServices;
 | |
| 
 | |
| namespace DevComponents.DotNetBar
 | |
| {
 | |
| 	/// <summary>
 | |
| 	/// Summary description for DesignTimeDte.
 | |
| 	/// </summary>
 | |
| 	public class DesignTimeDte
 | |
| 	{
 | |
| 		public static string GetProjectPath(IServiceProvider service)
 | |
| 		{
 | |
| 			object dte=DesignTimeDte.GetDTE(service);
 | |
| 			//EnvDTE.DTE dte=System.Runtime.InteropServices.Marshal.GetActiveObject("VisualStudio.DTE") as EnvDTE.DTE;
 | |
| 			if(dte!=null)
 | |
| 			{
 | |
| 				System.Array pjs=dte.GetType().InvokeMember("ActiveSolutionProjects",BindingFlags.GetProperty,null,dte, new object []{}) as System.Array;
 | |
| 				if(pjs==null)
 | |
| 				{
 | |
| 					//MessageBox.Show("Failed to get ActiveSolutionProjects");
 | |
| 					return "";
 | |
| 				}
 | |
| 				if(pjs.Length>0)
 | |
| 				{
 | |
| 					object project=pjs.GetValue(0);
 | |
| 					//MessageBox.Show(((EnvDTE.Project)project).Properties.Item("FullPath").Value.ToString());
 | |
| 					object properties=project.GetType().InvokeMember("Properties",BindingFlags.GetProperty,null,project, new object []{});
 | |
| 					if(properties!=null)
 | |
| 					{
 | |
| 						object item=properties.GetType().InvokeMember("Item",BindingFlags.InvokeMethod,null,properties, new object []{"FullPath"});
 | |
| 						if(item!=null)
 | |
| 						{
 | |
| 							object val=item.GetType().InvokeMember("Value",BindingFlags.GetProperty,null,item, new object []{});
 | |
| 							if(val!=null && val is string)
 | |
|                                 return val.ToString();
 | |
| 						}
 | |
| 						//else
 | |
| 						//	MessageBox.Show("Failed to get item");
 | |
| 					}
 | |
| 					//else
 | |
| 					//	MessageBox.Show("Failed to get properties");
 | |
| 				}
 | |
| 				//else
 | |
| 				//	MessageBox.Show("PJS length is ZERO");
 | |
| 			}
 | |
| 			//else
 | |
| 			//	MessageBox.Show("Failed to get DTE");
 | |
| 			return "";
 | |
| 		}
 | |
| 
 | |
| 		public static string GetDefinitionPath(string definitionName, IServiceProvider service)
 | |
| 		{
 | |
| 			// In design-time our document has to be open for definition to be loaded
 | |
| 			//EnvDTE.DTE dte=GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString()) as EnvDTE.DTE;
 | |
| 			object dte=DesignTimeDte.GetDTE(service); //GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
| 			if(dte==null)
 | |
| 				return "";
 | |
| 			//EnvDTE.Document doc=dte.ActiveDocument;
 | |
| 			object doc=dte.GetType().InvokeMember("ActiveDocument",BindingFlags.GetProperty,null,dte, new object []{});
 | |
| 			if(doc!=null)
 | |
| 			{
 | |
| 				//string docPath=doc.Path;
 | |
| 				string docPath=(string)doc.GetType().InvokeMember("Path",BindingFlags.GetProperty,null,doc, new object []{});
 | |
| 				if(!docPath.EndsWith("\\"))
 | |
| 					docPath+="\\";
 | |
| 				if(System.IO.File.Exists(docPath+definitionName))
 | |
| 					return docPath;
 | |
| 			}
 | |
| 			// Enumerate open documents and try to find our definition in thier path
 | |
| 			object documents=dte.GetType().InvokeMember("Documents",BindingFlags.GetProperty,null,dte, new object []{});
 | |
| 			//foreach(EnvDTE.Document doc1 in dte.Documents)
 | |
| 			int count=(int)documents.GetType().InvokeMember("Count",BindingFlags.GetProperty,null,documents, new object []{});
 | |
| 			for(int i=1;i<=count;i++)
 | |
| 			{
 | |
| 				object doc1=documents.GetType().InvokeMember("Item",BindingFlags.InvokeMethod,null,documents, new object []{i});
 | |
| 				//string docPath=doc1.Path;
 | |
| 				string docPath=(string)doc1.GetType().InvokeMember("Path",BindingFlags.GetProperty,null,doc1, new object []{});
 | |
| 				if(!docPath.EndsWith("\\"))
 | |
| 					docPath+="\\";
 | |
| 				if(System.IO.File.Exists(docPath+definitionName))
 | |
| 					return docPath;
 | |
| 			}
 | |
| 			// In need just return project path...
 | |
| 			return GetProjectPath(service);
 | |
| 		}
 | |
| 
 | |
| 		public static string GetActiveDocumentPath(IServiceProvider service)
 | |
| 		{
 | |
| 			// In design-time our document has to be open for definition to be loaded
 | |
| 			//EnvDTE.DTE dte=GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString()) as EnvDTE.DTE;
 | |
| 			//EnvDTE.Document doc=dte.ActiveDocument;
 | |
| 			object dte=DesignTimeDte.GetDTE(service); //GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
| 			if(dte==null)
 | |
| 				return "";
 | |
| 			object doc=dte.GetType().InvokeMember("ActiveDocument",BindingFlags.GetProperty,null,dte, new object []{});
 | |
| 			if(doc!=null)
 | |
| 			{
 | |
| 				string docPath=(string)doc.GetType().InvokeMember("Path",BindingFlags.GetProperty,null,doc, new object []{}); //doc.Path;
 | |
| 				if(!docPath.EndsWith("\\"))
 | |
| 					docPath+="\\";
 | |
| 				return docPath;
 | |
| 			}
 | |
| 			// In need just return project path...
 | |
| 			return GetProjectPath(service);
 | |
| 		}
 | |
| 
 | |
| 		public static bool AddFileToProject(string filename, IServiceProvider service)
 | |
| 		{
 | |
| 			bool ret=false;
 | |
| 			object dte=DesignTimeDte.GetDTE(service); //GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
| 			if(dte!=null)
 | |
| 			{
 | |
| //				System.Array pjs=dte.GetType().InvokeMember("ActiveSolutionProjects",BindingFlags.GetProperty,null,dte, new object []{}) as System.Array;
 | |
| //				if(pjs==null)
 | |
| //					return false;
 | |
| //
 | |
| //				if(pjs.Length>0)
 | |
| //				{
 | |
| //					object project=pjs.GetValue(0);					
 | |
| //				}
 | |
| 				object itemOperations=dte.GetType().InvokeMember("ItemOperations",BindingFlags.GetProperty,null,dte, new object []{});
 | |
| 				if(itemOperations!=null)
 | |
| 				{
 | |
| 					object projectItem=itemOperations.GetType().InvokeMember("AddExistingItem",BindingFlags.InvokeMethod,null,itemOperations, new object []{filename});
 | |
| 					if(projectItem!=null)
 | |
| 					{
 | |
| 						try
 | |
| 						{
 | |
| 							object props=projectItem.GetType().InvokeMember("Properties",BindingFlags.GetProperty,null,projectItem, new object []{});
 | |
| 							if(props!=null)
 | |
| 							{
 | |
| 								object item=props.GetType().InvokeMember("Item",BindingFlags.InvokeMethod,null,props, new object []{"BuildAction"});
 | |
| 								if(item!=null)
 | |
| 								{
 | |
| 									item.GetType().InvokeMember("Value",BindingFlags.SetProperty,null,item, new object []{3});
 | |
| 									ret=true;
 | |
| 								}
 | |
| 							}
 | |
| 						}
 | |
| 						catch
 | |
| 						{
 | |
| 							ret=true;
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 				//EnvDTE.ProjectItem item=dte.ItemOperations.AddExistingItem(filename);
 | |
| 				//item.Properties.Item("BuildAction").Value=3;
 | |
| //				foreach(EnvDTE.Property prop in item.Properties)
 | |
| //				{
 | |
| //					MessageBox.Show(prop.Name+"  "+prop.Value);
 | |
| //				}
 | |
| 			}
 | |
| 			return ret;
 | |
| 		}
 | |
| 
 | |
|         //public static bool DeleteFromProject(string filename, IServiceProvider service)
 | |
|         //{
 | |
|         //    try
 | |
|         //    {
 | |
|         //        object dte=DesignTimeDte.GetDTE(service); //GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
|         //        if(dte==null)
 | |
|         //            return false;
 | |
| 
 | |
|         //        System.Array pjs=dte.GetType().InvokeMember("ActiveSolutionProjects",BindingFlags.GetProperty,null,dte, new object []{}) as System.Array;
 | |
|         //        if(pjs==null)
 | |
|         //            return false;
 | |
| 
 | |
|         //        object project=null;
 | |
|         //        if(pjs.Length>0)
 | |
|         //            project=pjs.GetValue(0);
 | |
|         //        if(project==null)
 | |
|         //            return false;
 | |
| 
 | |
|         //        object pjItems=project.GetType().InvokeMember("ProjectItems",BindingFlags.GetProperty,null,project, new object []{});
 | |
|         //        if(pjItems==null)
 | |
|         //            return false;
 | |
| 
 | |
|         //        object pjItem=pjItems.GetType().InvokeMember("Item",BindingFlags.InvokeMethod,null,pjItems, new object []{filename});
 | |
|         //        //project.ProjectItems.Item(filename) as EnvDTE.ProjectItem;
 | |
|         //        if(pjItem==null)
 | |
|         //            return false;
 | |
| 
 | |
|         //        pjItem.GetType().InvokeMember("Delete",BindingFlags.InvokeMethod,null,pjItem, new object []{});
 | |
|         //        return true;
 | |
|         //    }
 | |
|         //    catch(Exception){}
 | |
|         //    return false;
 | |
|         //}
 | |
| 
 | |
| 		public static bool ExistInProject(string filename, IServiceProvider service)
 | |
| 		{
 | |
| //			EnvDTE.DTE dte=GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString()) as EnvDTE.DTE;
 | |
| //			if(dte==null)
 | |
| //				return false;
 | |
| //			Array projects=dte.ActiveSolutionProjects as Array;
 | |
| 			object dte=DesignTimeDte.GetDTE(service); //GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
| 			if(dte==null)
 | |
| 				return false;
 | |
| 
 | |
| 			System.Array projects=dte.GetType().InvokeMember("ActiveSolutionProjects",BindingFlags.GetProperty,null,dte, new object []{}) as System.Array;
 | |
| 			if(projects==null)
 | |
| 				return false;
 | |
| 			foreach(object pj in projects)
 | |
| 			{
 | |
| 				object pji=pj.GetType().InvokeMember("ProjectItems",BindingFlags.GetProperty,null,pj, new object []{});
 | |
| 				int count=(int)pji.GetType().InvokeMember("Count",BindingFlags.GetProperty,null,pji, new object []{});
 | |
| 				//foreach(EnvDTE.ProjectItem pi in pj.ProjectItems)
 | |
| 				for(int i=1;i<=count;i++)
 | |
| 				{
 | |
| 					object pi=pji.GetType().InvokeMember("Item",BindingFlags.InvokeMethod,null,pji, new object []{i});
 | |
| 					if(CheckProjectItem(pi,filename))
 | |
| 						return true;
 | |
| 				}
 | |
| 			}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		private static bool CheckProjectItem(object pi,string filename)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				string name=(string)pi.GetType().InvokeMember("Name",BindingFlags.GetProperty,null,pi, new object []{});
 | |
| 				if(name.ToLower()==filename.ToLower())
 | |
| 					return true;
 | |
| 				short fileCount=(short)pi.GetType().InvokeMember("FileCount",BindingFlags.GetProperty,null,pi, new object []{});
 | |
| 				for(short i=0;i<fileCount;i++)
 | |
| 				{
 | |
| 					//string fn=pi.get_FileNames(i);
 | |
| 					string fn=(string)pi.GetType().InvokeMember("get_FileNames",BindingFlags.GetProperty,null,pi, new object []{i});
 | |
| 					if(fn.ToLower().EndsWith(filename.ToLower()))
 | |
| 						return true;
 | |
| 				}
 | |
| 				object pji=pi.GetType().InvokeMember("ProjectItems",BindingFlags.GetProperty,null,pi, new object []{});
 | |
| 				int count=(int)pji.GetType().InvokeMember("Count",BindingFlags.GetProperty,null,pji, new object []{});
 | |
| 				for(int i=1;i<=count;i++)
 | |
| 				//foreach(EnvDTE.ProjectItem item in pi.ProjectItems)
 | |
| 				{
 | |
| 					object pItem=pji.GetType().InvokeMember("Item",BindingFlags.InvokeMethod,null,pji, new object []{i});
 | |
| 					if(CheckProjectItem(pItem,filename))
 | |
| 						return true;
 | |
| 				}
 | |
| 			}
 | |
| 			catch(Exception){}
 | |
| 			return false;
 | |
| 		}
 | |
| 
 | |
| 		public static bool ExistInProject2(string filename, IServiceProvider service)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				object dte=DesignTimeDte.GetDTE(service); //GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
| 				if(dte==null)
 | |
| 					return false;
 | |
| 
 | |
| 				System.Array pjs=dte.GetType().InvokeMember("ActiveSolutionProjects",BindingFlags.GetProperty,null,dte, new object []{}) as System.Array;
 | |
| 				if(pjs==null)
 | |
| 					return false;
 | |
| 
 | |
| 				object project=null;
 | |
| 				if(pjs.Length>0)
 | |
| 					project=pjs.GetValue(0);
 | |
| 				if(project==null)
 | |
| 					return false;
 | |
| 
 | |
| 				object pjItems=project.GetType().InvokeMember("ProjectItems",BindingFlags.GetProperty,null,project, new object []{});
 | |
| 				if(pjItems==null)
 | |
| 					return false;
 | |
| 
 | |
| 				object pjItem=pjItems.GetType().InvokeMember("Item",BindingFlags.InvokeMethod,null,pjItems, new object []{filename});
 | |
| 				if(pjItem==null)
 | |
| 					return false;
 | |
| 			}
 | |
| 			catch(Exception)
 | |
| 			{
 | |
| 				return false;
 | |
| 			}
 | |
| 
 | |
| 			return true;
 | |
| 		}
 | |
| 
 | |
| 		public static bool CheckOutFile(string filename, IServiceProvider service)
 | |
| 		{
 | |
| 			try
 | |
| 			{
 | |
| 				object dte=DesignTimeDte.GetDTE(service); //GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
| 				if(dte==null)
 | |
| 					return false;
 | |
| 				object sctrl=dte.GetType().InvokeMember("SourceControl",BindingFlags.GetProperty,null,dte, new object []{});
 | |
| 				if(sctrl==null)
 | |
| 				{
 | |
| 					return false;
 | |
| 				}
 | |
| 				object res=sctrl.GetType().InvokeMember("IsItemUnderSCC",BindingFlags.InvokeMethod,null,sctrl, new object []{filename});
 | |
| 				if(res!=null && res is bool && (bool)res==true)
 | |
| 				{
 | |
| 					res=sctrl.GetType().InvokeMember("CheckOutItem",BindingFlags.InvokeMethod,null,sctrl, new object []{filename});
 | |
| 					if(res!=null && res is bool)
 | |
| 						return (bool)res;
 | |
| 					else
 | |
| 						return false;
 | |
| 				}
 | |
| 				return true;
 | |
| 			}
 | |
| 			catch(Exception){}
 | |
|             return false;
 | |
| 		}
 | |
| 
 | |
| 		public static object GetDTE(IServiceProvider service)
 | |
| 		{
 | |
| 			object dte=GetMSDEVFromGIT("VisualStudio.DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
| 			if(dte==null)
 | |
| 				dte=GetMSDEVFromGIT(".DTE",System.Diagnostics.Process.GetCurrentProcess().Id.ToString());
 | |
| 			if(dte==null && service!=null)
 | |
| 			{
 | |
| 				Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies();
 | |
| 				foreach (Assembly a in loadedAssemblies)
 | |
| 				{
 | |
| 					if (a.FullName.ToLower().StartsWith("envdte"))
 | |
| 					{
 | |
| 						Type t=a.GetType("EnvDTE._DTE", false, true);
 | |
| 						if (t != null)
 | |
| 						{
 | |
| 							dte=service.GetService(t);
 | |
| 							break;
 | |
| 						}
 | |
| 					}
 | |
| 				}
 | |
| 			}
 | |
| 			return dte;
 | |
| 		}
 | |
| 
 | |
| #if FRAMEWORK20
 | |
| 		[DllImport("ole32.dll")]		
 | |
| 		public static extern int GetRunningObjectTable(int reserved, out 
 | |
| 			System.Runtime.InteropServices.ComTypes.IRunningObjectTable prot);
 | |
|         [DllImport("ole32.dll")]
 | |
|         public static extern int CreateBindCtx(int reserved, out System.Runtime.InteropServices.ComTypes.IBindCtx
 | |
|             ppbc);
 | |
| 
 | |
|         [STAThread]
 | |
|         public static object GetMSDEVFromGIT(string strProgID, string processId)
 | |
|         {
 | |
|             System.Runtime.InteropServices.ComTypes.IRunningObjectTable prot;
 | |
|             System.Runtime.InteropServices.ComTypes.IEnumMoniker pMonkEnum;
 | |
|             try
 | |
|             {
 | |
|                 GetRunningObjectTable(0, out prot);
 | |
|                 prot.EnumRunning(out pMonkEnum);
 | |
|                 pMonkEnum.Reset();          // Churn through enumeration.				
 | |
|                 IntPtr fetched=IntPtr.Zero;
 | |
|                 System.Runtime.InteropServices.ComTypes.IMoniker[] pmon = new System.Runtime.InteropServices.ComTypes.IMoniker[1];
 | |
|                 while (pMonkEnum.Next(1, pmon, fetched) == 0)
 | |
|                 {
 | |
|                     System.Runtime.InteropServices.ComTypes.IBindCtx pCtx;
 | |
|                     CreateBindCtx(0, out pCtx);
 | |
|                     string str;
 | |
|                     pmon[0].GetDisplayName(pCtx, null, out str);
 | |
|                     //					#if DEBUG
 | |
|                     //					System.Windows.Forms.MessageBox.Show(str+"   strProgId="+strProgID+"  processId="+processId);
 | |
|                     //					#endif
 | |
|                     if (str.IndexOf(strProgID) > 0 && (str.IndexOf(":" + processId) > 0 || processId == ""))
 | |
|                     {
 | |
|                         object objReturnObject;
 | |
|                         prot.GetObject(pmon[0], out objReturnObject);
 | |
|                         object ide = (object)objReturnObject;
 | |
|                         return ide;
 | |
|                     }
 | |
|                 }
 | |
|             }
 | |
|             catch
 | |
|             {
 | |
|                 return null;
 | |
|             }
 | |
|             return null;
 | |
|         }
 | |
| #else
 | |
|         [DllImport("ole32.dll")]		
 | |
| 		public static extern int GetRunningObjectTable(int reserved, out 
 | |
| 			UCOMIRunningObjectTable prot);	
 | |
|         [DllImport("ole32.dll")]		
 | |
| 		public static extern int  CreateBindCtx(int reserved, out UCOMIBindCtx 
 | |
| 			ppbc);
 | |
| 
 | |
|          [STAThread]		
 | |
| 		public static object GetMSDEVFromGIT(string strProgID, string processId)		
 | |
| 		{			
 | |
| 			UCOMIRunningObjectTable prot;			
 | |
| 			UCOMIEnumMoniker pMonkEnum;			
 | |
| 			try			
 | |
| 			{				
 | |
| 				GetRunningObjectTable(0,out prot);				
 | |
| 				prot.EnumRunning(out pMonkEnum);				
 | |
| 				pMonkEnum.Reset();          // Churn through enumeration.				
 | |
| 				int fetched;				
 | |
| 				UCOMIMoniker []pmon = new UCOMIMoniker[1];				
 | |
| 				while(pMonkEnum.Next(1, pmon, out fetched) == 0) 				
 | |
| 				{					
 | |
| 					UCOMIBindCtx pCtx;					
 | |
| 					CreateBindCtx(0, out pCtx);					
 | |
| 					string str;					
 | |
| 					pmon[0].GetDisplayName(pCtx,null,out str);
 | |
| //					#if DEBUG
 | |
| //					System.Windows.Forms.MessageBox.Show(str+"   strProgId="+strProgID+"  processId="+processId);
 | |
| //					#endif
 | |
| 					if(str.IndexOf(strProgID)>0 && (str.IndexOf(":"+processId)>0 || processId==""))
 | |
| 					{		
 | |
| 						object objReturnObject;		
 | |
| 						prot.GetObject(pmon[0],out objReturnObject);	
 | |
| 						object ide = (object)objReturnObject;		
 | |
| 						return ide;		
 | |
| 					}		
 | |
| 				}	
 | |
| 			}	
 | |
| 			catch	
 | |
| 			{	
 | |
| 				return null;	
 | |
| 			}
 | |
| 			return null;	
 | |
| 		}
 | |
| #endif
 | |
| 
 | |
| 
 | |
| 
 | |
|     }
 | |
| }
 |