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
}
}