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