I do this Code:
`public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
{
_applicationObject = (DTE2)application;
_addInInstance = (AddIn)addInInst;
if(connectMode == ext_ConnectMode.ext_cm_UISetup)
{
object[] contextGUIDS = new object[] { };
Commands2 commands = (Commands2)_applicationObject.Commands;
CommandBar SECommandBar = ((CommandBars)_applicationObject.CommandBars)["Context Menus"];
CommandBarPopup SEPopUps = (CommandBarPopup)SECommandBar.Controls["Project and Solution Context Menus"];
CommandBarPopup oCommandBar = (CommandBarPopup)SEPopUps.Controls["Project"];
CommandBarControl oControl = (CommandBarControl)
oCommandBar.Controls.Add(MsoControlType.msoControlButton,
System.Reflection.Missing.Value,
System.Reflection.Missing.Value, 1, true);
// Set the caption of the menuitem
oControl.Caption = "Create Documentation";
oSubMenuItemHandler = _applicationObject.Events.get_CommandBarEvents(oControl) as CommandBarEventsClass;
oSubMenuItemHandler.Click+=new _dispCommandBarControlEvents_ClickEventHandler(oSubMenuItemHandler_Click);
}
protected void oSubMenuItemHandler_Click(object CommandaBarControl,ref bool handled, ref bool cancelDefault)
{
// I Want to access object of selected class or interface
MessageBox.Show("Test");
}`
I'm Develop Add In to reflect all data of class in vs 2010. Please I want to access selected class or Interface to Reflect all member data. any one help me
You can get the active Project
as described here, then get its ProjectItems
and for each ProjectItem
its FileCodeModel
and then iterate over its CodeElements
with Kind
= vsCMElementInterface
to get the Interfaces defined there
Example:
// Container for results
List<string> classes = new List<string> ();
List<string> interfaces = new List<string> ();
// Get selected projects from solution explorer
Array projects = (Array)_applicationObject.ActiveSolutionProjects;
// Get all ProjectItems inside of the selected Projects
var projectItems = projects
.OfType<Project> ()
.Where ( p => p.ProjectItems != null )
.SelectMany ( p => p.ProjectItems.OfType<ProjectItem> ().Where ( pi => pi.FileCodeModel != null ) );
// Iterate over all of these ProjectItems
foreach ( ProjectItem projectItem in projectItems )
{
// Get all of the CodeElements (Interfaces and Classes) inside of the current ProjectItem (recursively)
var elements = projectItem.FileCodeModel.CodeElements
.OfType<CodeElement> ()
.SelectMany ( ce => this.GetCodeElements ( ce ) );
// Do something with the CodeElements that were found
classes.AddRange ( elements.Where ( el => el.Kind == vsCMElement.vsCMElementClass ).Select ( el => el.Name ) );
interfaces.AddRange ( elements.Where ( el => el.Kind == vsCMElement.vsCMElementInterface).Select ( el => el.Name ) );
}
// Possible implementation of GetCodeElements:
private IEnumerable<CodeElement> GetCodeElements ( CodeElement root )
{
List<CodeElement> result = new List<CodeElement> ();
if ( root == null )
return result;
// If the current CodeElement is an Interface or a class, add it to the results
if ( root.Kind == vsCMElement.vsCMElementClass || root.Kind == vsCMElement.vsCMElementInterface )
{
result.Add ( root );
}
// Check children recursively
if ( root.Children != null && root.Children.Count > 0 )
{
foreach ( var item in root.Children.OfType<CodeElement> () )
{
result.AddRange ( this.GetCodeElements ( item ) );
}
}
}