<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://blogs.msdn.com/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-US"><title type="html">Huizhong Long's WebLog</title><subtitle type="html">VS Add-ins, macros and Code Model</subtitle><id>http://blogs.msdn.com/hlong/atom.xml</id><link rel="alternate" type="text/html" href="http://blogs.msdn.com/hlong/default.aspx" /><link rel="self" type="application/atom+xml" href="http://blogs.msdn.com/hlong/atom.xml" /><generator uri="http://communityserver.org" version="2.1.61025.2">Community Server</generator><updated>2005-09-27T19:53:00Z</updated><entry><title>Visual Studio 2005 Automation Samples now available</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/hlong/archive/2006/01/30/519610.aspx" /><id>http://blogs.msdn.com/hlong/archive/2006/01/30/519610.aspx</id><published>2006-01-30T22:36:00Z</published><updated>2006-01-30T22:36:00Z</updated><content type="html">&lt;p&gt;The Visual Studio 2005 Automation Samples are now available for download at&lt;br&gt;&lt;a href="http://msdn.microsoft.com/vstudio/downloads/code/automation/default.aspx"&gt;http://msdn.microsoft.com/vstudio/downloads/code/automation/default.aspx&lt;/a&gt;&lt;/br&gt;&lt;/p&gt;
&lt;p&gt;It includes new samples for VS 2005 and samples updated to use the new VS 2005 .AddIn mechanism. Please feel free to download and try them out!&lt;br&gt;&lt;/br&gt;&lt;/p&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=519610" width="1" height="1"&gt;</content><author><name>hlong</name><uri>http://blogs.msdn.com/members/hlong.aspx</uri></author></entry><entry><title>Loading VS Add-ins from URL</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/hlong/archive/2005/10/04/476993.aspx" /><id>http://blogs.msdn.com/hlong/archive/2005/10/04/476993.aspx</id><published>2005-10-04T22:26:00Z</published><updated>2005-10-04T22:26:00Z</updated><content type="html">&lt;P&gt;In Visual Studio 2005, managed add-ins are allowed to get loaded from a website as long as you enable it in Tools Options Add-in/Macros Security page and also fully trust the add-in assembly from the URL. To load an add-in from a URL, you need to:&lt;/P&gt;
&lt;P&gt;1. Make sure in Tools Options Environment &lt;FONT color=#0000ff&gt;Add-in/Macros Security&lt;/FONT&gt; page, &lt;BR&gt;&lt;FONT color=#000000&gt;&lt;FONT color=#0000ff&gt;"&lt;FONT color=#0000ff&gt;Allow Add-in compoments to load from a URL&lt;/FONT&gt;"&lt;/FONT&gt; is checked.&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;2. &lt;/FONT&gt;Use CasPol.exe to fully trust the add-in assembly from the URL.&lt;BR&gt;The command is like "&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;CasPol.exe -m -ag 1.2 -url &lt;/STRONG&gt;&lt;/FONT&gt;&lt;A href="http://mywebsite/myAddin.dll"&gt;&lt;FONT color=#0000ff&gt;http://myWebSite/myAddin.dll&lt;/FONT&gt;&lt;/A&gt;&lt;FONT color=#0000ff&gt; &lt;STRONG&gt;FullTrust&lt;/STRONG&gt;&lt;/FONT&gt;"&lt;/P&gt;
&lt;P&gt;(Check out the following blog entry to see more details with &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;CasPol.exe&lt;/STRONG&gt;&lt;/FONT&gt;: &lt;BR&gt;&lt;a href="http://blogs.msdn.com/shawnfa/archive/2004/12/30/344554.aspx"&gt;http://blogs.msdn.com/shawnfa/archive/2004/12/30/344554.aspx&lt;/A&gt;)&lt;/P&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;3. Update the &lt;FONT color=#0000ff&gt;&amp;lt;Assembly&amp;gt;&lt;/FONT&gt; tag in the .Addin XML file.&lt;/P&gt;
&lt;P&gt;The .Addin XML file looks like&lt;BR&gt;&amp;lt;?xml version="1.0" encoding="UTF-16" standalone="no"?&amp;gt;&lt;BR&gt;&amp;lt;Extensibility xmlns="&lt;A href="http://schemas.microsoft.com/AutomationExtensibility"&gt;http://schemas.microsoft.com/AutomationExtensibility&lt;/A&gt;"&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;HostApplication&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Name&amp;gt;Microsoft Visual Studio&amp;lt;/Name&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Version&amp;gt;8.0&amp;lt;/Version&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/HostApplication&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;Addin&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;FriendlyName&amp;gt;WebAddin&amp;lt;/FriendlyName&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;Description&amp;gt;WebAddin&amp;lt;/Description&amp;gt;&lt;BR&gt;&amp;nbsp; &lt;FONT color=#0000ff&gt;&amp;lt;Assembly&amp;gt;http://SomeWebsite/WebAddin.dll&amp;lt;/Assembly&amp;gt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp; &amp;lt;FullClassName&amp;gt;WebAddin.Connect&amp;lt;/FullClassName&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;LoadBehavior&amp;gt;0&amp;lt;/LoadBehavior&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;CommandPreload&amp;gt;0&amp;lt;/CommandPreload&amp;gt;&lt;BR&gt;&amp;nbsp; &amp;lt;CommandLineSafe&amp;gt;0&amp;lt;/CommandLineSafe&amp;gt;&lt;BR&gt;&amp;nbsp;&amp;lt;/Addin&amp;gt;&lt;BR&gt;&amp;lt;/Extensibility&amp;gt;&lt;/P&gt;
&lt;P&gt;Also, if you are working on a Win2K3 server machine, make sure you have proper&lt;FONT color=#0000ff&gt;&amp;nbsp;IE Security setting&lt;/FONT&gt; (go to IE Tools/ Internet Options/Security and add the website that hosting the add-in)&lt;BR&gt;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=476993" width="1" height="1"&gt;</content><author><name>hlong</name><uri>http://blogs.msdn.com/members/hlong.aspx</uri></author></entry><entry><title>VS Code Model events</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/hlong/archive/2005/10/04/476987.aspx" /><id>http://blogs.msdn.com/hlong/archive/2005/10/04/476987.aspx</id><published>2005-10-04T21:55:00Z</published><updated>2005-10-04T21:55:00Z</updated><content type="html">&lt;P&gt;Users of the Code Model may be alerted of significant changes of code by listening for events with a &lt;FONT color=#0000ff&gt;CodeModelEvents&lt;/FONT&gt; object. The CodeModelEvents object is in EnvDTE80, you get it by casting DTE.Events to&amp;nbsp;&lt;FONT color=#0000ff&gt;EnvDTE80.Events2&lt;/FONT&gt;, e.g. in VB, it is like CType(DTE.Events, EnvDTE80.Events2).CodeModelEvents.&amp;nbsp;These events will be fired as the languages rebuild the code model after edits have been made.&amp;nbsp; The timing and ordering of these events is not guaranteed to be consistent across different languages.&amp;nbsp; This object provides three events:&amp;nbsp; ElementAdded, ElementChanged, and ElementDeleted.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;ElementAdded event&lt;/FONT&gt;&lt;BR&gt;This event is raised when a CodeElement object has been created.&amp;nbsp; The new object is passed into the event handler. Although the object containing the new element is changed by the addition, no events are raised by the parent object.&amp;nbsp; For example, if a parameter is added to a function the ElementAdded event will be raised for the new CodeParameter object.&amp;nbsp; No events will be raised for the CodeFunction object that contains it.&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;ElementChanged event&lt;/FONT&gt;&lt;BR&gt;This event is raised when a CodeElement object has been changed. Only one ElementChanged event is made for any given change in the code.&amp;nbsp; The "most local" object would raise the event.&amp;nbsp; For example, if a function's name is changed, the ElementChanged event would be fired for that CodeFunction object only.&amp;nbsp; (There would not be an event raised for the containing CodeClass object.)&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;ElementDeleted event&lt;/FONT&gt;&lt;BR&gt;This event is raised when a CodeElement object is deleted. It is only raised for the outermost element that was removed.&amp;nbsp; For example, if the user deletes an entire class, the only ElementRemoved event will be only&amp;nbsp;for the CodeClass object.&lt;/P&gt;
&lt;P&gt;You can use following macros to play around with Code Model events by watching the output from OutputWindowPane "CodeModel Events Output" in the Output Window.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim owpane As OutputWindowPane&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;Public WithEvents myCMEvents As EnvDTE80.CodeModelEvents&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub &lt;FONT color=#0000ff&gt;myCMEvents_ElementAdded&lt;/FONT&gt;(ByVal Element As EnvDTE.CodeElement) Handles myCMEvents.ElementAdded&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane.OutputString("myCMEvents_ElementAdded - Element Name = " &amp;amp; Element.Name &amp;amp; "; Kind = " &amp;amp; Element.Kind.ToString() &amp;amp; vbCrLf)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub &lt;FONT color=#0000ff&gt;myCMEvents_ElementChanged&lt;/FONT&gt;(ByVal Element As EnvDTE.CodeElement, ByVal Change As EnvDTE80.vsCMChangeKind) Handles myCMEvents.ElementChanged&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane.OutputString("myCMEvents_ElementChanged - Element Name = " &amp;amp; Element.Name &amp;amp; "; Kind = " &amp;amp; Element.Kind.ToString() &amp;amp; "&amp;nbsp; ChangeKind = " &amp;amp; Change.ToString() &amp;amp; vbCrLf)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Private Sub &lt;FONT color=#0000ff&gt;myCMEvents_ElementDeleted&lt;/FONT&gt;(ByVal Parent As Object, ByVal Element As EnvDTE.CodeElement) Handles myCMEvents.ElementDeleted&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cc As CodeElement = CType(Parent, CodeElement)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane.OutputString("myCMEvents_ElementDeleted - Element Name = " &amp;amp; Element.Name &amp;amp; "; Kind = " &amp;amp; Element.Kind.ToString() &amp;amp; " Parent = " &amp;amp; Parent.ToString() &amp;amp; vbCrLf)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub tryCodeModelEvents()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane = GetOutputWindowPane("CodeModel Events Output")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane.OutputString("CodeModel Events Testing starts:" &amp;amp; vbCrLf)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;myCMEvents = CType(DTE.Events, EnvDTE80.Events2).CodeModelEvents&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As System.Exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane.OutputString(ex.ToString())&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Function GetOutputWindowPane(ByVal Name As String, Optional ByVal show As Boolean = True) As OutputWindowPane&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim win As Window = DTE.Windows.Item(EnvDTE.Constants.vsWindowKindOutput)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If show Then win.Visible = True&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ow As OutputWindow = win.Object&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim owpane As OutputWindowPane&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane = ow.OutputWindowPanes.Item(Name)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch e As System.Exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane = ow.OutputWindowPanes.Add(Name)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; owpane.Activate()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Return owpane&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Function&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=476987" width="1" height="1"&gt;</content><author><name>hlong</name><uri>http://blogs.msdn.com/members/hlong.aspx</uri></author></entry><entry><title>Code Model &amp; its Interop with Text Editor Object Model</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/hlong/archive/2005/10/03/476662.aspx" /><id>http://blogs.msdn.com/hlong/archive/2005/10/03/476662.aspx</id><published>2005-10-04T04:07:00Z</published><updated>2005-10-04T04:07:00Z</updated><content type="html">&lt;P&gt;The &lt;FONT color=#0000ff&gt;Visual Studio Code Model&lt;/FONT&gt; can be used to read and edit the structure of the code in a file. The model gives you the ability to interact with files from different langauges in a common way without parsing the code. With this model, an automation client (e.g. add-in/macro) would start from a solution or project to get to a project item, and from the project item to get to the code model. Specifically, from a &lt;FONT color=#0000ff&gt;ProjectItem&lt;/FONT&gt;, you get to a &lt;FONT color=#0000ff&gt;FileCodeModel&lt;/FONT&gt; object that gets you to a &lt;FONT color=#0000ff&gt;CodeElements&lt;/FONT&gt; collection. At the FileCodeModel level, it contains a CodeElement object for each top-level code element in the file (e.g. &amp;nbsp;Implements statement, WithEvents declaration, etc).&amp;nbsp; At the class level, the CodeElements collection contains a CodeElement for each member of the class (e.g. a code function). You can &lt;FONT color=#0000ff&gt;QI&lt;/FONT&gt; (or &lt;FONT color=#0000ff&gt;cast&lt;/FONT&gt; in C# and VB) to get to more powerful language-specific interfaces.&lt;BR&gt;A key functionality of code model is the ability to &lt;FONT color=#0000ff&gt;interop with the Text Editor OM. &lt;/FONT&gt;In other words, an automation client can go from the editor's automation model to a code model object and from a code model object to the start and end point of the code as text in the editor (for example, you have a Method object in hand, get its StartPoint, and inject a few lines of code, or you handle the LineChanged event, get the EditPoint in the event, and map it to a Method code object).&lt;BR&gt;Following are some macro samples that&amp;nbsp;demonstrate how to walk through the code model hierarchy of a solution and how to inteop with Text Editor Object Model.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub walkThroughFileCodeModel()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim projectItems As ProjectItems&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim projectItem As ProjectItem&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim fileCodeModel As FileCodeModel&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim codeElements As CodeElements&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim sRes As String = ""&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim level As Integer&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each proj As Project In DTE.Solution&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; projectItems = proj.ProjectItems&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each projectItem In projectItems&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 'Debug.WriteLine(projectItem.Name)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; fileCodeModel = &lt;FONT color=#0000ff&gt;projectItem.FileCodeModel&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; level = -1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not fileCodeModel Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; codeElements = &lt;FONT color=#0000ff&gt;fileCodeModel.CodeElements&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; codeElementChildren(codeElements, sRes, level)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sRes += vbNewLine&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(sRes)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub codeElementChildren(ByVal codeElements As CodeElements, ByRef sRes As String, ByVal level As Integer)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim i As Integer&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; level += 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For Each clt As &lt;FONT color=#0000ff&gt;CodeElement&lt;/FONT&gt; In codeElements&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 1 To level&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sRes += vbTab&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sRes += String.Format("{0}, Kind = {1}&amp;nbsp; Line:{2} ~ {3} ", clt.Name, clt.Kind, clt.StartPoint.Line, clt.EndPoint.Line)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As System.Exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If TypeOf clt Is EnvDTE80.CodeImport Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ci As EnvDTE80.CodeImport = CType(clt, EnvDTE80.CodeImport)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sRes += String.Format("{0}, Kind = {1}&amp;nbsp; Line:{2} ~ {3} ", ci.Namespace, clt.Kind, clt.StartPoint.Line, clt.EndPoint.Line)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Else&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sRes += String.Format("&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; , Kind = {0}&amp;nbsp; Line:{1} ~ {2} ", clt.Kind, clt.StartPoint.Line, clt.EndPoint.Line)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sRes += vbNewLine&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not clt.Children Is Nothing Then&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; codeElementChildren(clt.Children, sRes, level)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Catch ex As System.Exception&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.WriteLine(ex.Message)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Try&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub fromCodelModel2TextEditor()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim fcm As FileCodeModel = DTE.ActiveDocument.ProjectItem.FileCodeModel&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cns As CodeNamespace = fcm.CodeElements.Item("ClassLibraryCS")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cc As CodeClass = cns.Children.Item("Class1")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim tp As TextPoint = &lt;FONT color=#0000ff&gt;cc.GetEndPoint&lt;/FONT&gt; 'cc.&lt;FONT color=#0000ff&gt;GetStartPoint&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim ep As EditPoint = tp.CreateEditPoint&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ep.Insert("blah")&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Sub fromTextEditor2CodeModel()&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim td As TextDocument = DTE.ActiveDocument.Object&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim cc As CodeClass = td.Selection.&lt;FONT color=#0000ff&gt;ActivePoint.CodeElement&lt;/FONT&gt;(vsCMElement.vsCMElementClass)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Debug.WriteLine(cc.Name)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; End Sub&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=476662" width="1" height="1"&gt;</content><author><name>hlong</name><uri>http://blogs.msdn.com/members/hlong.aspx</uri></author></entry><entry><title>Creating a ToolWindow hosting a .NET user control</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/hlong/archive/2005/09/30/475887.aspx" /><id>http://blogs.msdn.com/hlong/archive/2005/09/30/475887.aspx</id><published>2005-10-01T00:49:00Z</published><updated>2005-10-01T00:49:00Z</updated><content type="html">&lt;P&gt;In previous version of VS, if you want to create a &lt;FONT color=#0000ff&gt;ToolWindow&lt;/FONT&gt; hosting a &lt;FONT color=#0000ff&gt;.NET user control&lt;/FONT&gt; by using &lt;FONT color=#0000ff&gt;Windows.CreateToolWindow&lt;/FONT&gt;, you'll have to use a &lt;a href="http://blogs.msdn.com/craigskibo/archive/2003/09/30/51677.aspx"&gt;&lt;FONT color=#0000ff&gt;shim control&lt;/FONT&gt; &lt;/A&gt;to support it. Now with VS 2005, you don't need the shim any more. It is so handy by using &lt;FONT color=#0000ff&gt;Windows2.CreateToolWindow2&lt;/FONT&gt;, you pass the assembly location and the class name, you are able to host your .NET user control in the ToolWindow you created.&lt;BR&gt;Following is a C# code snippet showing how to&amp;nbsp;implement this&amp;nbsp;in an add-in:&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Windows2 win = (Windows2)_applicationObject.Windows;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; object ctl = null;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Guid g = Guid.NewGuid();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; System.Reflection.Assembly asm = System.Reflection.Assembly.GetExecutingAssembly();&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Window myToolWin = win.&lt;FONT color=#0000ff&gt;CreateToolWindow2&lt;/FONT&gt;(_addInInstance, asm.Location, "MyToolWin.UserControl1", "My Tool Window", "{" + g.ToString() +"}", ref ctl);&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#0000ff&gt;myToolWin.Visible = true&lt;/FONT&gt;;&lt;/P&gt;
&lt;P&gt;One thing I want to point it out is when the User Control is not in the same assembly as the add-in, CreateToolWindow2 does not return a reference to the user control (ctl is null). You either need to &lt;FONT color=#0000ff&gt;move the control into the same assembly as the Add-in&lt;/FONT&gt;&lt;FONT color=#0000ff&gt;, or set all the attributes on the control to make it fully COM visible&lt;/FONT&gt;. Also, to make the ToolWindow show up, you need to set myToolWin.Visible = true.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=475887" width="1" height="1"&gt;</content><author><name>hlong</name><uri>http://blogs.msdn.com/members/hlong.aspx</uri></author></entry><entry><title>Displaying custom bitmap for VS add-in command button from satellite DLL</title><link rel="alternate" type="text/html" href="http://blogs.msdn.com/hlong/archive/2005/09/27/474522.aspx" /><id>http://blogs.msdn.com/hlong/archive/2005/09/27/474522.aspx</id><published>2005-09-28T05:53:00Z</published><updated>2005-09-28T05:53:00Z</updated><content type="html">&lt;P&gt;Add-ins can get resources such as strings, icons, and bitmaps from satellite DLLs which separates resources from your add-in. The first time I tried to get add-in resources from its satellite DLL, I easily find out how to do it for resources like strings and icons. But for bitmaps, it took me really a long time to figure out (for both native &amp;amp; managed add-ins). There indeed are some tricky steps that are hard to find out, so I thought it would be really good to blog it.&lt;/P&gt;
&lt;P&gt;In previous verions of VS (2002 &amp;amp; 2003), add-ins used reg key values "SatelliteDllName" and "SatelliteDllPath" to store info for satellite DLLs. Now with Visual Studio 2005, you don't need to bother with registry for managed add-ins (although you still need it for native add-ins) any more. For resources like &lt;FONT color=#0000ff&gt;strings&lt;/FONT&gt; and &lt;FONT color=#0000ff&gt;icons&lt;/FONT&gt;, it is quite straightforward. To briefly state here, you simply prepend the resource name with the &lt;FONT color=#0000ff&gt;@&lt;/FONT&gt; character in the .Addin XML file, in this way the add-in will look for the resource from its satellite DLL, e.g. &amp;lt;FriendlyName&amp;gt;@String1&amp;lt;/FriendlyName&amp;gt;. "String1" is the resource name in the satellite DLL. One thing I want to point out is, for add-in Help/About box icon, you need to use tag &lt;FONT color=#0000ff&gt;&amp;lt;AboutIconLocation&amp;gt;&lt;/FONT&gt; instead of &amp;lt;AboutIconData&amp;gt;, like &amp;lt;AboutIconLocation&amp;gt;@Icon1&amp;lt;/AboutIconLocation&amp;gt;, which may be confusing.&lt;/P&gt;
&lt;P&gt;For resources like &lt;FONT color=#0000ff&gt;bitmaps&lt;/FONT&gt;, the way you get it from satellite DLLs is quite different and tricky. From my experience, It seems like if you miss one little step, you won't get it work and it is hard to figure out what's going wrong. What's more, the way you do it for native add-ins and managed add-ins is different. So I am going to list the steps in detail here for both native &amp;amp; managed add-ins respectively:&lt;/P&gt;&lt;FONT color=#0000ff&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Creating a native satellite DLL with a custom bitmap and getting it from a native add-in:&lt;/FONT&gt;&lt;BR&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. Create&lt;/FONT&gt;&lt;/FONT&gt;&amp;nbsp;a C++ Win32 DLL&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. Add a Resource File (.rc)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. In Resource View, add &lt;FONT color=#0000ff&gt;a bitmap (16 x 16)&lt;/FONT&gt;, give it a &lt;FONT color=#0000ff&gt;numeric ID&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. Build the DLL&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. Create a subfolder "1033" (for English locale) in the native add-in DLL directory&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 6. Copy the satellite DLL to "1033" directory&lt;/P&gt;
&lt;P&gt;To get the bitmap show up with the command, make sure&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. The bitmap must be 16 x 16 (True Color)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. Update &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;AddNamedCommand2&lt;/STRONG&gt;&lt;/FONT&gt; in Connect.cpp with '&lt;FONT color=#0000ff&gt;MSOButton&lt;/FONT&gt;' set to &lt;FONT color=#0000ff&gt;VARIANT_FALSE&lt;/FONT&gt;, and '&lt;FONT color=#0000ff&gt;Bitmap&lt;/FONT&gt;' set to the &lt;FONT color=#0000ff&gt;bitmap ID&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. Open AddIn.rgs and add two reg key values "SatelliteDllName" and "SatelliteDllPath" (see the example below)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. Rebuild the add-in to get the updated info registered&lt;/P&gt;
&lt;P&gt;(&lt;FONT color=#0000ff&gt;NOTE&lt;/FONT&gt;: One thing you may miss here in&amp;nbsp;3. is:&amp;nbsp;&lt;FONT color=#0000ff&gt;for "SatelliteDllPath" do not put the locale ID &lt;/FONT&gt;although it is part of the full path, it will be automatically appended at runtime)&lt;/P&gt;
&lt;P&gt;Here is an example:&lt;/P&gt;
&lt;P&gt;HKCU&lt;BR&gt;{&lt;BR&gt;&amp;nbsp;NoRemove 'SOFTWARE'&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;NoRemove 'Microsoft'&lt;BR&gt;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;NoRemove 'VisualStudio'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NoRemove '8.0'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;NoRemove 'AddIns'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;ForceRemove 'NativeAddinCustBitmap.Connect'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val LoadBehavior = d 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val CommandLineSafe = d 0&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val CommandPreload = d 1&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val FriendlyName = s 'NativeAddinCustBitmap'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val Description = s 'NativeAddinCustBitmap Description'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val &lt;FONT color=#0000ff&gt;SatelliteDllName&lt;/FONT&gt; = s 'NativeAddinCustBitmapUI.dll'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;val &lt;FONT color=#0000ff&gt;SatelliteDllPath&lt;/FONT&gt; = s 'E:\CustomBitmap\NativeAddinCustBitmap\NativeAddinCustBitmap\Debug'&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;}&lt;BR&gt;&lt;FONT color=#0000ff&gt;&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;FONT color=#0000ff&gt;Creating a managed satellite DLL with a custom bitmap and getting it from a managed add-in:&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. Add a Resources file to the managed add-in project, say "Resource1.resx" (set the Build Action to None)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. Add your bitmap (&lt;FONT color=#0000ff&gt;16 x 16&lt;/FONT&gt;) to the resource, give the bitmap a numeric ID&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. Run "&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;resgen Resource1.resx&lt;/STRONG&gt;&lt;/FONT&gt;" to create "Resource1.resources"&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 4. Run "&lt;FONT color=#0000ff&gt;&lt;STRONG&gt;al.exe /embed:Resource1.resources /culture:en-US /out:YourAddinName.resources.dll&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; (use System.Globalization.CultureInfo.InstalledUICulture to get the correct culture, here I use 'en-US' as an example.)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 5. Create a subfolder named 'en-US' or the correct culture name in the add-in DLL directory&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;6. Copy YourAddinName.resources.dll to the subfolder created in step 5.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#0000ff&gt;(One handy thing is that you don't even need to put satelliteDll info in the .AddIn XML file.)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;To get the bitmap show up with the command, make sure:&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 1. The bitmap must be &lt;FONT color=#0000ff&gt;16 x 16&lt;/FONT&gt; (True Color or 16 Color)&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 2. The bitmap must have a name that&amp;nbsp;is actually &lt;FONT color=#0000ff&gt;decimal number&lt;/FONT&gt;. The ResX designer in VS doesn't allow numeric IDs for resources. You have to edit the resx directly and ignore the warnings.&lt;BR&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; 3. Update &lt;FONT color=#0000ff&gt;&lt;STRONG&gt;AddNamedCommand2&lt;/STRONG&gt;&lt;/FONT&gt; with '&lt;FONT color=#0000ff&gt;MSOButton&lt;/FONT&gt;' param set to &lt;FONT color=#0000ff&gt;false&lt;/FONT&gt;, and the '&lt;FONT color=#0000ff&gt;bitmap&lt;/FONT&gt;' param set to the &lt;FONT color=#0000ff&gt;bitmap ID&lt;/FONT&gt;.&lt;/P&gt;
&lt;P&gt;Hope I have made it clear.&lt;/P&gt;&lt;img src="http://blogs.msdn.com/aggbug.aspx?PostID=474522" width="1" height="1"&gt;</content><author><name>hlong</name><uri>http://blogs.msdn.com/members/hlong.aspx</uri></author></entry></feed>