{"id":2931,"date":"2011-08-04T14:39:00","date_gmt":"2011-08-04T17:39:00","guid":{"rendered":"http:\/\/uruitest.crmgamified.com\/2011\/08\/visual-studio-2010-addin-setting-a-class-breakpoint\/"},"modified":"2023-05-31T08:39:50","modified_gmt":"2023-05-31T11:39:50","slug":"visual-studio-2010-addin-setting-a-class-breakpoint","status":"publish","type":"post","link":"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/","title":{"rendered":"Visual Studio 2010 Addin: Setting a class breakpoint"},"content":{"rendered":"<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_17 counter-hierarchy counter-decimal ez-toc-grey\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\">Contents<\/p>\n<span class=\"ez-toc-title-toggle\"><a class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" style=\"display: none;\"><i class=\"ez-toc-glyphicon ez-toc-icon-toggle\"><\/i><\/a><\/span><\/div>\n<nav><ul class=\"ez-toc-list ez-toc-list-level-1\"><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Visual_Studio_2010_Addin_Setting_a_class_breakpoint\" title=\"Visual Studio 2010 Addin: Setting a class breakpoint\">Visual Studio 2010 Addin: Setting a class breakpoint<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Creating_an_addin_project\" title=\"Creating an addin project\">Creating an addin project<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Handling_events\" title=\"Handling events\">Handling events<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Adding_commands\" title=\"Adding commands\">Adding commands<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Browsing_the_code\" title=\"Browsing the code\">Browsing the code<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Managing_breakpoints\" title=\"Managing breakpoints\">Managing breakpoints<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Installer\" title=\"Installer\">Installer<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Download\" title=\"Download\">Download<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#CodePlex_project\" title=\"CodePlex project\">CodePlex project<\/a><\/li><li class=\"ez-toc-page-1 ez-toc-heading-level-1\"><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/uruit.com\/blog\/visual-studio-2010-addin-setting-a-class-breakpoint\/#Conclusions\" title=\"Conclusions\">Conclusions<\/a><\/li><\/ul><\/nav><\/div>\n<h1><span class=\"ez-toc-section\" id=\"Visual_Studio_2010_Addin_Setting_a_class_breakpoint\"><\/span><span data-sheets-value=\"{&quot;1&quot;:2,&quot;2&quot;:&quot;Visual Studio 2010 Addin: Setting a class breakpoint&quot;}\" data-sheets-userformat=\"{&quot;2&quot;:15231,&quot;3&quot;:{&quot;1&quot;:0},&quot;4&quot;:{&quot;1&quot;:2,&quot;2&quot;:16777215},&quot;5&quot;:{&quot;1&quot;:[{&quot;1&quot;:2,&quot;2&quot;:0,&quot;5&quot;:{&quot;1&quot;:2,&quot;2&quot;:0}},{&quot;1&quot;:0,&quot;2&quot;:0,&quot;3&quot;:3},{&quot;1&quot;:1,&quot;2&quot;:0,&quot;4&quot;:1}]},&quot;6&quot;:{&quot;1&quot;:[{&quot;1&quot;:2,&quot;2&quot;:0,&quot;5&quot;:{&quot;1&quot;:2,&quot;2&quot;:0}},{&quot;1&quot;:0,&quot;2&quot;:0,&quot;3&quot;:3},{&quot;1&quot;:1,&quot;2&quot;:0,&quot;4&quot;:1}]},&quot;7&quot;:{&quot;1&quot;:[{&quot;1&quot;:2,&quot;2&quot;:0,&quot;5&quot;:{&quot;1&quot;:2,&quot;2&quot;:0}},{&quot;1&quot;:0,&quot;2&quot;:0,&quot;3&quot;:3},{&quot;1&quot;:1,&quot;2&quot;:0,&quot;4&quot;:1}]},&quot;8&quot;:{&quot;1&quot;:[{&quot;1&quot;:2,&quot;2&quot;:0,&quot;5&quot;:{&quot;1&quot;:2,&quot;2&quot;:0}},{&quot;1&quot;:0,&quot;2&quot;:0,&quot;3&quot;:3},{&quot;1&quot;:1,&quot;2&quot;:0,&quot;4&quot;:1}]},&quot;9&quot;:0,&quot;11&quot;:3,&quot;12&quot;:0,&quot;14&quot;:{&quot;1&quot;:2,&quot;2&quot;:0},&quot;15&quot;:&quot;Calibri&quot;,&quot;16&quot;:11}\">Visual Studio 2010 Addin: Setting a class breakpoint<\/span><span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>There comes a time in the life of every .NET developer when you need Visual Studio to do something that<br \/>\ncan only be described as a &#8220;class breakpoint&#8221;: a quick command to set a breakpoint on every access to a class.<br \/>\nUnfortunately, after googling this concept, you&#8217;ll find out that there&#8217;s no easy way to accomplish this in Visual Studio.<br \/>\nIn this article I present an addin that I created, which adds this and another similar command to the debug menu of the<br \/>\ndevelopment environment:<\/p>\n<p><a href=\"http:\/\/weblogs.asp.net\/blogs\/uruit\/ConsoleApplication1---Microsoft-Visual-Studio-Administrator_2011-08-03_20-40-57_2ACFD6D3.png\" class=\"broken_link external\" rel=\"nofollow\"><img loading=\"lazy\" style=\"padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;\" title=\"ConsoleApplication1 - Microsoft Visual Studio (Administrator)_2011-08-03_20-40-57\" src=\"\/wp-content\/uploads\/2011\/08\/ConsoleApplication1-Microsoft-Visual-Studio-Administrator_2011-08-03_20-40-57_thumb_646E5CBE.png\" alt=\"ConsoleApplication1 - Microsoft Visual Studio (Administrator)_2011-08-03_20-40-57\" width=\"337\" height=\"484\" border=\"0\" \/><\/a><\/p>\n<p>When the command is activated, it sets a breakpoint on every function and property of every class in the current document:<\/p>\n<p><a href=\"http:\/\/weblogs.asp.net\/blogs\/uruit\/ConsoleApplication1---Microsoft-Visual-Studio-Administrator_2011-08-03_20-38-46_1B54012C.png\" class=\"broken_link external\" rel=\"nofollow\"><img loading=\"lazy\" style=\"padding-left: 0px; padding-right: 0px; padding-top: 0px; border-width: 0px;\" title=\"ConsoleApplication1 - Microsoft Visual Studio (Administrator)_2011-08-03_20-38-46\" src=\"\/wp-content\/uploads\/2011\/08\/ConsoleApplication1-Microsoft-Visual-Studio-Administrator_2011-08-03_20-38-46_thumb_49C19676.png\" alt=\"ConsoleApplication1 - Microsoft Visual Studio (Administrator)_2011-08-03_20-38-46\" width=\"382\" height=\"484\" border=\"0\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n<p><span style=\"font-size: small;\">This addin can be downloaded here: <\/span><a href=\"https:\/\/weblogs.asp.net\/blogs\/uruit\/VSAddin\/BreakAll%20-%20Installer.zip\" class=\"broken_link external\" rel=\"nofollow\"><span style=\"font-size: small;\">Installer<\/span><\/a><span style=\"font-size: small;\"> | <\/span><a href=\"https:\/\/weblogs.asp.net\/blogs\/uruit\/VSAddin\/BreakAll%20-%20Source.zip\" class=\"broken_link external\" rel=\"nofollow\"><span style=\"font-size: small;\">Source code<\/span><\/a><\/p>\n<p><span style=\"font-size: medium;\"><br \/>\n<\/span>Also, note that this addin is language agnostic, meaning that it will work for C#, Visual Basic, and even native C++ applications.<\/p>\n<p>In the rest of the article I&#8217;ll show the basic steps to create a simple addin for Visual Studio 2010.<\/p>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"Creating_an_addin_project\"><\/span>Creating an addin project<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p><a href=\"http:\/\/weblogs.asp.net\/blogs\/uruit\/New-Project_2011-08-03_20-48-32_7B0858D8.png\" class=\"broken_link external\" rel=\"nofollow\"><img loading=\"lazy\" style=\"padding-left: 0px; padding-right: 0px; padding-top: 0px; border: 0px;\" title=\"New Project_2011-08-03_20-48-32\" src=\"\/wp-content\/uploads\/2011\/08\/New-Project_2011-08-03_20-48-32_thumb_73A8852C.png\" alt=\"New Project_2011-08-03_20-48-32\" width=\"644\" height=\"364\" border=\"0\" \/><\/a><\/p>\n<p>Visual Studio makes it easy to create an addin project by providing a template. In the New project dialog,<br \/>\nselect Other project types, extensibility, Visual Studio Add-In.<br \/>\nYou&#8217;ll see that a very simple project is created, with the core logic around a class named Connect. This class manages<br \/>\nthe lifecycle of the addin through the methods OnConnection, OnDisconnection, etc.<br \/>\nThe class field _applicationObject holds a DTE2 object through which we communicate with the environment.<\/p>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"Handling_events\"><\/span>Handling events<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>In this particular case we want to add a command to the Debug menu after a solution is loaded. Therefore, we will need<br \/>\nto wait until a solution is loaded. All the solution events are exposed through the DTE2.Events.SolutionEvents object:<\/p>\n<pre>\u00a0\u00a0\u00a0 _solutionEvents = _applicationObject.Events.SolutionEvents;  \r\n\u00a0\u00a0\u00a0 _solutionEvents.Opened += new _dispSolutionEvents_OpenedEventHandler(OnSolutionOpened);\r\n\r\n\u00a0\u00a0\u00a0 _solutionEvents.AfterClosing += new _dispSolutionEvents_AfterClosingEventHandler(OnSolutionClosed);<\/pre>\n<p>There&#8217;s a minor caveat here. I&#8217;m keeping the reference to the SolutionEvents object in a field of the Connect class.<br \/>\nIf I didn&#8217;t do this, the SolutionEvents object would be deleted by the garbage collector, and the events would never<br \/>\nbe raised.<\/p>\n<h1><span class=\"ez-toc-section\" id=\"Adding_commands\"><\/span>Adding commands<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Once that we handle the opening event, we need to add the command to the user interface:<\/p>\n<pre>\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">object<\/span>[] contextGUIDS = <span style=\"color: #0000ff;\">new object<\/span>[] { };  \r\n\u00a0\u00a0\u00a0 <span style=\"color: #4bacc6;\">Commands2<\/span> commands = (<span style=\"color: #4bacc6;\">Commands2<\/span>)_applicationObject.Commands;  \r\n\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">string<\/span> debugMenuName = <span style=\"color: #c0504d;\">\"Debug\"<\/span>;<\/pre>\n<pre>\u00a0\u00a0\u00a0 <span style=\"color: #004000;\">\/\/Place the command on the debug menu.  \r\n\u00a0\u00a0\u00a0 \/\/Find the MenuBar command bar, which is the top-level command bar holding all the main menu items:<\/span>   \r\n\u00a0\u00a0\u00a0 Microsoft.VisualStudio.CommandBars.<span style=\"color: #4bacc6;\">CommandBar<\/span> menuBarCommandBar =   \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ((Microsoft.VisualStudio.CommandBars.<span style=\"color: #4bacc6;\">CommandBars<\/span>)_applicationObject.CommandBars)[<span style=\"color: #c0504d;\">\"MenuBar\"<\/span>];<\/pre>\n<pre>\u00a0\u00a0\u00a0 \/\/Find the Debug command bar on the MenuBar command bar:   \r\n\u00a0\u00a0\u00a0 <span style=\"color: #4bacc6;\">CommandBarControl<\/span> debugControl = menuBarCommandBar.Controls[debugMenuName];   \r\n\u00a0\u00a0\u00a0 <span style=\"color: #4bacc6;\">CommandBarPopup<\/span> debugPopup = (CommandBarPopup)debugControl;<\/pre>\n<pre>\u00a0\u00a0\u00a0 _command = \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 commands.AddNamedCommand2  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 _addInInstance,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #c0504d;\">\"CommandName\"<\/span>,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #c0504d;\">\"Text to show in the menu\"<\/span>,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #c0504d;\">\"Description of the command\"<\/span>,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">true<\/span>,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #4bacc6;\">Type<\/span>.Missing,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">ref<\/span> contextGUIDS,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (<span style=\"color: #0000ff;\">int<\/span>)vsCommandStatus.vsCommandStatusSupported + (<span style=\"color: #0000ff;\">int<\/span>)vsCommandStatus.vsCommandStatusEnabled,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 (<span style=\"color: #0000ff;\">int<\/span>)vsCommandStyle.vsCommandStylePictAndText,  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vsCommandControlType.vsCommandControlTypeButton  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 );  \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \r\n\u00a0\u00a0\u00a0 _command.AddControl(debugPopup.CommandBar, 1);<\/pre>\n<p>This code grabs the Debug menu and adds the command with the specified parameters. This code should be wrapped in a<br \/>\ntry-catch block to handle cases when the command already exists in the menu.<br \/>\nWe can also add a keyboard shortcut to the command in the following way:<\/p>\n<pre>\u00a0\u00a0\u00a0 _command.Bindings = <span style=\"color: #c0504d;\">\"Text Editor::ctrl+d, z\"<\/span>;<\/pre>\n<p>Here &#8220;Text Editor&#8221; defines the scope of the shortcut. For more information see <a href=\"http:\/\/msdn.microsoft.com\/en-us\/library\/envdte.command.bindings.aspx\" class=\"external\" rel=\"nofollow\">http:\/\/msdn.microsoft.com\/en-us\/library\/envdte.command.bindings.aspx<\/a><\/p>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"Browsing_the_code\"><\/span>Browsing the code<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Visual Studio automatically parses the current document and exposes a nice interface to browse the code. A code document<br \/>\ncontains a tree of code elements. Each code element can be a namespace, a class, a method, etc, and it contains a<br \/>\ncollection of child code elements in it. The root code elements can be accessed in this way:<\/p>\n<pre>\u00a0\u00a0\u00a0 <span style=\"color: #4bacc6;\">CodeElements<\/span> elementsInDocument = <span style=\"color: #0000ff;\">this<\/span>._applicationObject.ActiveDocument.ProjectItem.FileCodeModel.CodeElements<\/pre>\n<p>To show the browsing algorithm, here&#8217;s a recursive method that shows how to get all the classes in the current document:<\/p>\n<pre>\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">private static void<\/span> RecursiveClassSearch(<span style=\"color: #4bacc6;\">CodeElements<\/span> elements, <span style=\"color: #4bacc6;\">List<\/span>&lt;<span style=\"color: #4bacc6;\">CodeClass<\/span>&gt; foundClasses) \r\n\u00a0\u00a0\u00a0 { \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 <span style=\"color: #0000ff;\">foreach<\/span> (<span style=\"color: #4bacc6;\">CodeElement<\/span> codeElement in elements) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if (codeElement is <span style=\"color: #4bacc6;\">CodeClass<\/span>) \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 { \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 foundClasses.Add(codeElement as <span style=\"color: #4bacc6;\">CodeClass<\/span>); \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 RecursiveClassSearch(codeElement.Children, foundClasses); \r\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 } \r\n\u00a0\u00a0\u00a0 } \r\n<\/pre>\n<h1><\/h1>\n<h1><span class=\"ez-toc-section\" id=\"Managing_breakpoints\"><\/span>Managing breakpoints<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Managing breakpoints is very straighforward. The interface exposed through this._applicationObject.Debugger.Breakpoints<br \/>\nis pretty self descriptive, and it contains functionally to add, remove and browse through breakpoints.<\/p>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"Installer\"><\/span>Installer<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>Once you finished you addin, the best way to distribute it is to use a Visual Studio Installer project. An addin consists<br \/>\nof only two files: an *.AddIn xml file and a dll. The easiest way to distribute them is to install them in the same<br \/>\ndirectory, anywhere on the target machine (might be in ProgramFiles), and to add that directory to the addins directories<br \/>\nof Visual Studio. The latter can be done easily with a registry key: In the registry editor window of your installation<br \/>\nproject, add a string key at &#8220;HKLMSoftwareMicrosoftVisualStudio10.0AutomationOptionsLookInFolders&#8221; with the name<br \/>\n[TARGETDIR] and a descriptive name in the value. The installer will resolve the [TARGETDIR] placeholder at runtime.<\/p>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"Download\"><\/span>Download<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p><span style=\"font-size: small;\">This addin can be downloaded here: <\/span><a href=\"https:\/\/weblogs.asp.net\/blogs\/uruit\/VSAddin\/BreakAll%20-%20Installer.zip\" class=\"broken_link external\" rel=\"nofollow\"><span style=\"font-size: small;\">Installer<\/span><\/a><span style=\"font-size: small;\"> | <\/span><a href=\"https:\/\/weblogs.asp.net\/blogs\/uruit\/VSAddin\/BreakAll%20-%20Source.zip\" class=\"broken_link external\" rel=\"nofollow\"><span style=\"font-size: small;\">Source code<\/span><\/a><\/p>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"CodePlex_project\"><\/span>CodePlex project<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p><span style=\"font-size: small;\">Here&#8217;s the CodePlex site for this project: <span style=\"font-size: small;\">http:\/\/breakall.codeplex.com<\/span><\/span><\/p>\n<p>&nbsp;<\/p>\n<h1><span class=\"ez-toc-section\" id=\"Conclusions\"><\/span>Conclusions<span class=\"ez-toc-section-end\"><\/span><\/h1>\n<p>In this article I presented a useful addin for Visual Studio and I also showed how to create customs addins. For more information on creating addins you can visit the MSDN: <a title=\"http:\/\/msdn.microsoft.com\/en-us\/vstudio\/ff677564\" href=\"http:\/\/msdn.microsoft.com\/en-us\/vstudio\/ff677564\" class=\"external\" rel=\"nofollow\">http:\/\/msdn.microsoft.com\/en-us\/vstudio\/ff677564<\/a>. I hope you find the addin useful as I do (maybe I&#8217;ll publish a second version in the future) and I hope to see your great addins soon!<\/p>\n<p>Thanks for reading!<br \/>\nAlfonso Cora<\/p>\n<pre><\/pre>\n<p><img loading=\"lazy\" src=\"https:\/\/weblogs.asp.net\/aggbug.aspx?PostID=7896899\" alt=\"\" width=\"1\" height=\"1\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Contents Visual Studio 2010 Addin: Setting a class breakpointCreating an addin projectHandling eventsAdding commandsBrowsing the codeManaging breakpointsInstallerDownloadCodePlex projectConclusions Visual Studio 2010 Addin: Setting a class breakpoint There comes a time&#8230;<\/p>\n","protected":false},"author":22,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[276],"tags":[42,94,210],"_links":{"self":[{"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/posts\/2931"}],"collection":[{"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/users\/22"}],"replies":[{"embeddable":true,"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/comments?post=2931"}],"version-history":[{"count":5,"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/posts\/2931\/revisions"}],"predecessor-version":[{"id":11231,"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/posts\/2931\/revisions\/11231"}],"wp:attachment":[{"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/media?parent=2931"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/categories?post=2931"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/uruit.com\/blog\/wp-json\/wp\/v2\/tags?post=2931"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}