StrataFrame Forum

How to get project items from VS add-in

http://forum.strataframe.net/Topic14460.aspx

By Paul Chase - 2/20/2008

I am trying to create an VS add in for my reporting engine. I need to be able to loop through each project and then loop through the project and find reports by type. (Like you do with the Bo Mapper) .. i am trying something like below just cannot figure out how to load or just get at the assembly. thanks for  any help

Dim LoProject As Project

Dim loAssembly As Reflection.Assembly

Try

'Check to see if Solution is open, I forget everytime debugging this

If Not _appobject.Solution.IsOpen Then

MessageBox.Show("Please load solution")

Else

For Each LoProject In _appobject.Solution.Projects

'show what projects we have

MessageBox.Show("Project Name: " & LoProject.FullName)

'-- Here i need to be able to load the assembly and then do through the types

' loAssembly = Reflection.Assembly.Load

For Each loType As Type In loAssembly.GetTypes()

If loType.IsSubclassOf(GetType(DevExpress.XtraReports.UI.XtraReport)) Then

Me.ListView1.Items.Add(loType.FullName)

End If

Next

Next

End If

Catch objException As System.Exception

MessageBox.Show(objException.ToString)

End Try


 

By Trent L. Taylor - 2/20/2008

You are going to have to use the EnvDTE name space, you will then wan to get a DTE object and once you have that, you will be able to get the ActiveSolution, and enumerate the Projects with the solution:

You will want to create a class and implement the IDTExtensibility2 implemention on your class.  This will require that a method called OnConnection be created.  This method has a parameter called Application which can be typed as a DTE or DTE2 object, and this will be your entry point:

Imports EnvDTE
Imports EnvDTE80

Public Class MyAddIn
 Implements IDTExtensibility2

 Private _DTE As DTE2

 Public Sub OnConnection(ByVal application As Object, ByVal connectMode As ext_ConnectMode, ByVal addInInst As Object, ByRef custom As Array) Implements IDTExtensibility2.OnConnection
  _DTE = CTYpe(application, DTE2)

 End Sub

End Class

You can also create a wizard class that implements the IWizard interface which will give you a similar starting point and you can tie into template that shows up under (New Item).  This will allow you to provide additional functionality when creating a new item.  This class has a RunStarted method on that implemention and the automationObject is the DTE object in this case.

Once you have the DTE object, you can then get the active solution and project items:

For Each proj As EnvDTE.Project In _DTE.Solution.Projects
    '-- You can access the project and pretty much everything associated with that project
    For each item as ProjectItem in proj.ProjectItems
    Next
Next
By Paul Chase - 2/20/2008

Hi Trent I got the reference but am still having trouble trying to find objects of a certain type. hopefully the code below makes sense. For whatever reason I am missing something and it is driving me nutsSmile Thanks for your help

Paul

Public Sub New(ByVal AppObject As EnvDTE80.DTE2)

' This call is required by the Windows Form Designer.

InitializeComponent()

' Add any initialization after the InitializeComponent() call.

_appobject = AppObject

End Sub

'-- Form Variables

Private _appobject As DTE2

'-- Build Report List

Private Sub BuildReportList()

'-- Local Variables

Dim loType As Type

Dim LoProject As Project

Try

'Check to see if Solution is open, I forget everytime debugging this

If Not _appobject.Solution.IsOpen Then

MessageBox.Show("Please load solution dummy")

Else

For Each LoProject In _appobject.Solution.Projects

'-- Here i need to be able find type that are subclassed from dev ex report

'

For Each item As ProjectItem In LoProject.ProjectItems

'- Code below doesnt work but should illustrate what i am trying to do

loType = item.GetType

'--check the type and see if it is a subclass of a dev ex report

If loType.IsSubclassOf(GetType(DevExpress.XtraReports.UI.XtraReport)) Then

'add it to the list

Me.ListView2.Items.Add(loType.FullName, 0)

End If

Next

Next

End If

Catch objException As System.Exception

MessageBox.Show(objException.ToString)

End Try

 

This code would work normally but as an add in I guess the solution is in a seperate app domain.

For Each loAssembly As Reflection.Assembly In AppDomain.CurrentDomain.GetAssemblies

'-- Check the assembly if the name starts with ActionLabor then it is all mine

If loAssembly.FullName.StartsWith("ActionLabor") Then

'-- Cycle through all of the types...

For Each loType As Type In loAssembly.GetTypes()

' only get types that inherite from dev ex report

If loType.IsSubclassOf(GetType(DevExpress.XtraReports.UI.XtraReport)) Then

'---- We found one now do something with it

End If

Next

End If

Next

By Trent L. Taylor - 2/20/2008

That won't work in most cases.  You will have to use the ITypeDiscoveryService to search for the object types.  Using the IsSubClassOf will work under cetain conditions, but you will miss a lot of classes or types.  You can get the ITypeDiscoveryService reference through the GetService method on a provider (IServiceProvider):

Dim disc As ITypeDiscoveryService
Dim loList As ICollection

disc = CType(Provider.GetService(GetType(ITypeDiscoveryService)), ITypeDiscoveryService)
loList = disc.GetTypes(MyBaseType, False)

For each i as Type in loList
Next

By Paul Chase - 2/20/2008

Thanks alot Trent I'll try that,  so much for "It will probably be faster to make a small add in to generate report metadata" BigGrin  Aw well nothing is ever easy is it?

Thanks again for the help

By Trent L. Taylor - 2/20/2008

Aw well nothing is ever easy is it?

No...add-ins are a MAJOR commitment.  Once you get one going, and have an understanding of the DTE it gets better, but it is a very deep, complex, and painful environment to develop for.  But once you get it integrated and helping you out, then it becomes worth the pain BigGrin