<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:georss="http://www.georss.org/georss" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-6471778</id><updated>2009-10-31T00:04:30.146+02:00</updated><title type="text">Ivan Mitev In The Software Trenches</title><subtitle type="html">Technology weblog on .NET development and other things that make the world go round</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://immitev.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default?start-index=26&amp;max-results=25" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>257</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/immitev" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry><id>tag:blogger.com,1999:blog-6471778.post-3087419394849787698</id><published>2008-12-25T15:47:00.002+02:00</published><updated>2008-12-25T16:06:44.244+02:00</updated><title type="text">Summary of the year 2008</title><content type="html">Another quite year of blogging, though the last quarter this blog was somewhat resurrected.&lt;br /&gt;&lt;br /&gt;It has been 2.5 years since I started working on &lt;a href="http://www.validata.co.uk/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Validata&lt;/span&gt;&lt;/a&gt; product. The last year was moderately interesting one,. I worked on various staff, the most notable of which are an HTTP load testing tool (pretty challenging task) and a language parser using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;ANTLR&lt;/span&gt; (just for a week). I also continued to work on our web application and a couple of desktop applications. I feel good that some my ideas finally were implemented and went in production. Also I think my efforts to improve our development process start to pay off...&lt;br /&gt;&lt;br /&gt;Unfortunately my pet project with  &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;ActiveRecord&lt;/span&gt;, Monorail, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;MySql&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;JQuery&lt;/span&gt; that I got started was put on hold in &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;february&lt;/span&gt;, but still it was a good learning experience. After getting to know Monorail, now I quickly got was ASP.NET &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;MVC&lt;/span&gt; all about.&lt;br /&gt;&lt;br /&gt;Next year, I plan to become an &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;MCTS&lt;/span&gt; (I think my company finds more value in those certifications, than I do), so I am starting with &lt;a href="http://www.microsoft.com/learning/en/us/exams/70-536.aspx"&gt;70-536&lt;/a&gt;. As a matter of fact, this morning I finally took a practice test from the training kit. I expected to top it without reading a word from the training book, but wishful thinking did not suffice :) I realized that there are areas of the .NET Framework that I don't know enough about i.e. .NET Security, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;WMI&lt;/span&gt;, Interoperability. I wonder if I concentrate only on those areas, will this be enough to pass the exam. Having solid 4 years experience in the .NET world should be a good starting point, so reading a few chapters for a couple of days might be exactly what I need.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-3087419394849787698?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/3087419394849787698/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=3087419394849787698&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/3087419394849787698" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/3087419394849787698" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/RkFrk8TJ_bo/summary-of-year-2008.html" title="Summary of the year 2008" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2008/12/summary-of-year-2008.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-3534584873528561062</id><published>2008-11-05T11:36:00.001+02:00</published><updated>2008-11-05T11:36:37.326+02:00</updated><title type="text">Helper for ANTLR Grammar</title><content type="html">&lt;p&gt;So I mentioned I am working on a ANTLR grammar (though not for long). And the experience with it was not always smooth.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;We are trying to define a grammar for an existing language which is pretty complex (several hundreds of statements). Every new parser rule had the potential to break the grammar. After inputting several rules, we had difficulty identifying the problematic one. It required a lot of discipline to compile the grammar after each change.&lt;/li&gt;    &lt;li&gt;Two developers are preparing the grammar together. Once or twice a day, we are merging the .g file. The merging proved to be quite error-prone.&lt;/li&gt;    &lt;li&gt;The ANTLRWorks IDE is not always stable. In some scenarios it freezes and has to be restarted.&lt;/li&gt;    &lt;li&gt;The errors and warnings were displayed together, so we had no way of filtering only errors (and we had many warnings).&lt;/li&gt;    &lt;li&gt;The C# code generation is buggy in some scenarios - we got an error of a duplicate identifier.&lt;/li&gt;    &lt;li&gt;After each compilations we had to overwrite the lexer and parser CS file in our C# project.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;The solution&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;So I wrote an desktop application that monitors the ANTLR grammar file and on each change, it compiles it and does some post-processing to fix the C# code using a simple regex.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Other features&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&amp;#183; Specify settings in .config file (grammar file, working folder, antllr install dir)&lt;/p&gt;  &lt;p&gt;&amp;#183; View compilation output - complete output, and only errors&lt;/p&gt;  &lt;p&gt;&amp;#183; View history of compilation attempts and results&lt;/p&gt;  &lt;p&gt;&amp;#183; View notifications as balloon tips (displayed only on significant changes &amp;#8211; broken grammar and fixed grammar)&lt;/p&gt;  &lt;p&gt;&amp;#183; Automatically save the last successful build in a subfolder of the working folder&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Was it worth it?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Yes, automating error-prone operations is always a good idea. We had problems with merging a few times and this continuous compilation enabled us to quickly find the problematic rules. The tool took me initially 3 hours to develop and additional 50% to maintain and bug fix.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;How could we extend it?&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Generating the C# files from the grammar is not enough. Its output should be included in the project. Then compile successfully. Then pass some unit tests. We have not reached this stage yet.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Points of interest&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;There is a good discussion &lt;a href="http://social.msdn.microsoft.com/Forums/en-US/csharpide/thread/ab359140-36e5-440b-a1ea-5fc64c4ca435/"&gt;here&lt;/a&gt; about how to change the .g file, save, hit F5 in Visual Studio and have it use the most recent version of the generated files. Apparently you need a custom tool to do so. A custom tool as a managed assembly that contains a class that implements the IvsSingleFileGenerator interface. Here is a link to an &lt;a href="http://www.codeproject.com/KB/cs/VsMultipleFileGenerator.aspx "&gt;article&lt;/a&gt; how to create such a custom tool.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;P.S.&lt;/strong&gt; If you are interested in the code, let me know. I would have uploaded it on CodePlex, but currently it has a dependency to a third-party grid, so I should better use a normal grid, instead.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-3534584873528561062?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/3534584873528561062/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=3534584873528561062&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/3534584873528561062" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/3534584873528561062" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/loLOgegFCZ0/helper-for-antlr-grammar.html" title="Helper for ANTLR Grammar" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2008/11/helper-for-antlr-grammar.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-9200106473738520973</id><published>2008-10-29T16:41:00.001+02:00</published><updated>2008-10-29T16:41:04.019+02:00</updated><title type="text">My Meta Parser</title><content type="html">&lt;p&gt;This is fun... I am working now on a task related to ANTLR and its grammar files. Since the grammar file got big and a bit messy, I wrote a small utility to parse the grammar file (.g file) and to sort the parser rules by name. So there it is: a parser of the parser... my meta parser&lt;/p&gt;  &lt;p&gt;NOTE: Well, it was not a full-blown parser, but having the parser rules more strictly structured, made it easy enough to implement.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-9200106473738520973?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/9200106473738520973/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=9200106473738520973&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/9200106473738520973" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/9200106473738520973" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/tnxXwpdSsYg/my-meta-parser.html" title="My Meta Parser" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2008/10/my-meta-parser.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-961923310087665057</id><published>2008-10-27T09:37:00.001+02:00</published><updated>2008-10-27T09:37:38.567+02:00</updated><title type="text">Ways to Compare .NET Assemblies</title><content type="html">&lt;p&gt;Sometimes comparing source code is not a viable option, and one has to resort to comparing assemblies (hopefully not obfuscated) to find out what is new, what has changed and what is removed. This kind of activity can be useful in many ways:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Determine what amount of work was done between two releases &lt;/li&gt;    &lt;li&gt;Estimate the impact of the changes (e.g. what is needed to be retested). &lt;/li&gt;    &lt;li&gt;Spend some work time doing playing with such amusing stuff :)&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;But how could you do it:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Commercial Tools&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.ndepend.com/"&gt;NDepend&lt;/a&gt; - I have only watched their &lt;a href="http://s3.amazonaws.com/NDependOnlineDemos/BuildComparison_viewlet_swf.html"&gt;video&lt;/a&gt; and it is impressive. Unfortunately the trial version does not support build comparison, so you should buy the product to try it for yourself. It is a pretty feature rich product that you can use for a variety of reasons.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.bitwidgets.com/"&gt;Bitdiffer&lt;/a&gt; - This sole purpose of this tool is comparing assemblies. It lacks some of the NDepend visualizations goodness, but is nevertheless an excellent tool. You might use its GUI application as well as its command line version to automate your work.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Poor Man's Tools&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.codingsanity.com/diff.htm"&gt;Reflector Diff AddIn&lt;/a&gt; - We all love Reflector and this is one of its useful addins. You can either view the differences or you can have a XML report.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://code.msdn.microsoft.com/fds"&gt;Framework Design Studio&lt;/a&gt; - There is a short review &lt;a href="http://blogs.microsoft.co.il/blogs/bursteg/archive/2008/04/17/compare-net-assemblies-with-framework-design-studio.aspx"&gt;here&lt;/a&gt;. Unfortunately the tool does not work with all assemblies and I can't report good results with it.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-961923310087665057?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/961923310087665057/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=961923310087665057&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/961923310087665057" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/961923310087665057" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/XZ7quCQFwY8/ways-to-compare-net-assemblies.html" title="Ways to Compare .NET Assemblies" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2008/10/ways-to-compare-net-assemblies.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-5770094388969057609</id><published>2008-10-23T14:31:00.001+03:00</published><updated>2008-10-23T14:31:39.799+03:00</updated><title type="text">VS.NET Macro To Display All File References in a VS.NET Solution</title><content type="html">&lt;p&gt;&lt;strong&gt;The problem&lt;/strong&gt;: You have a large solution (mine is with 154 projects) and you want to quick find if you use file references and to what assemblies are they).&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The solution:&lt;/strong&gt; see the files below. Add the following module and class and execute ShowAllFileReferencesGroupedByProject()&lt;/p&gt;  &lt;p&gt;Module:&lt;/p&gt;  &lt;div style="font-size: 12pt; background: #202020; color: #eeeeee; font-family: calibri"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;EnvDTE&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;EnvDTE80&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Collections&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Generic&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Diagnostics&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Text&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Windows&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Forms&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Module&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VsProjectsManagement&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Sub&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;ShowAllFileReferencesGroupedByProject&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;StringBuilder&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;finder&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;FileReferencesFinder&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;Dictionary&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;)) = &lt;span style="color: #f2f0df"&gt;finder&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;GetAllFileReferencesInSolution&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;True&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;sortedProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;)(&lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Keys&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;sortedProject&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Sort&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;AddressOf&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;FileReferencesFinder&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;CompareProjectsByName&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Keys&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Append&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Project&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Name&lt;/span&gt;).&lt;span style="color: #f2f0df"&gt;Append&lt;/span&gt;(&lt;span style="font-weight: bold; color: aqua"&gt;&amp;quot; : &amp;quot;&lt;/span&gt;).&lt;span style="color: #f2f0df"&gt;AppendLine&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;reference&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Item&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;AppendLine&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;reference&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;AppendLine&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;Debug&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Write&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;ToString&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;MessageBox&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Show&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;sb&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;ToString&lt;/span&gt;, &lt;span style="font-weight: bold; color: aqua"&gt;&amp;quot;File references&amp;quot;&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Sub&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;p&gt;Class FileReferencesFinder:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-size: 12pt; background: #202020; color: #eeeeee; font-family: calibri"&gt;   &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;EnvDTE&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;EnvDTE80&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Collections&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Generic&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Diagnostics&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Text&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Imports&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;System&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Windows&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Forms&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Class&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;FileReferencesFinder&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Private&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;GetAllSolutionVsProjects&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProjects&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;Project&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;DTE&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Solution&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Projects&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #90ee90"&gt;TypeOf&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt;.Object &lt;span style="color: #90ee90"&gt;Is&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;vsProjects&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Add&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;proj&lt;/span&gt;.Object)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Return&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProjects&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Shared&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;CompareProjectsByName&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;prj1&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;, &lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;prj2&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;) &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Integer&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;name1&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt; = &lt;span style="color: #f2f0df"&gt;prj1&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Project&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Name&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;name2&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt; = &lt;span style="color: #f2f0df"&gt;prj2&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Project&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Name&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Return&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Compare&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;name1&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;name2&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Public&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;GetAllFileReferencesInSolution&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;ignoreNetFrameworkAssemgblies&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Boolean&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;Dictionary&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;))&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;GetAllSolutionVsProjects&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;references&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;) = &lt;span style="color: #f2f0df"&gt;GetProjectFileReferences&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;ignoreNetFrameworkAssemgblies&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;references&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Count&lt;/span&gt; &amp;gt; &lt;span style="color: aqua"&gt;0&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Add&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt;, &lt;span style="color: #f2f0df"&gt;references&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Return&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Private&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;GetProjectFileReferences&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;VSProject&lt;/span&gt;, &lt;span style="color: #90ee90"&gt;ByVal&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;ignoreNetFrameworkAssemgblies&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Boolean&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Dim&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #90ee90"&gt;New&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;List&lt;/span&gt;(&lt;span style="color: #90ee90"&gt;Of&lt;/span&gt; &lt;span style="color: #90ee90"&gt;String&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Each&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt; &lt;span style="color: #90ee90"&gt;As&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Reference&lt;/span&gt; &lt;span style="color: #90ee90"&gt;In&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;vsProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;References&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Type&lt;/span&gt; = &lt;span style="color: #f2f0df"&gt;VSLangProj&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;prjReferenceType&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;prjReferenceTypeAssembly&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;SourceProject&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Is&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Nothing&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;ignoreNetFrameworkAssemgblies&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Path&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;StartsWith&lt;/span&gt;(&lt;span style="font-weight: bold; color: aqua"&gt;&amp;quot;C:\Windows\Microsoft.NET\Framework\&amp;quot;&lt;/span&gt;) &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Continue&lt;/span&gt; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Path&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;StartsWith&lt;/span&gt;(&lt;span style="font-weight: bold; color: aqua"&gt;&amp;quot;C:\Program Files\Reference Assemblies\Microsoft\Framework\&amp;quot;&lt;/span&gt;) &lt;span style="color: #90ee90"&gt;Then&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Continue&lt;/span&gt; &lt;span style="color: #90ee90"&gt;For&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Add&lt;/span&gt;(&lt;span style="color: #f2f0df"&gt;objReference&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Path&lt;/span&gt;)&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;If&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Next&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;.&lt;span style="color: #f2f0df"&gt;Sort&lt;/span&gt;()&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;Return&lt;/span&gt; &lt;span style="color: #f2f0df"&gt;fileReferences&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&amp;#160;&amp;#160; &lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Function&lt;/span&gt;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&amp;#160;&lt;/p&gt;    &lt;p style="margin: 0px"&gt;&lt;span style="color: #90ee90"&gt;End&lt;/span&gt; &lt;span style="color: #90ee90"&gt;Class&lt;/span&gt;&lt;/p&gt; &lt;/div&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-5770094388969057609?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/5770094388969057609/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=5770094388969057609&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/5770094388969057609" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/5770094388969057609" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/QYOADmbLMXQ/vsnet-macro-to-display-all-file.html" title="VS.NET Macro To Display All File References in a VS.NET Solution" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2008/10/vsnet-macro-to-display-all-file.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-207966519196534448</id><published>2008-10-20T16:53:00.001+03:00</published><updated>2008-10-20T16:53:55.840+03:00</updated><title type="text">DevReach 2008</title><content type="html">&lt;p&gt;A week after the event, I am writing a short review of some of the presentations on DevReach conference&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Key Note - &lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#StephenForte"&gt;&lt;em&gt;Stephen Forte &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; very funny keynote. Also a great historical overview of Microsoft strategy for the data access. Steohen showed good examples that Microsoft is a reactive (not a proactive) company.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall1_2"&gt;To AJAX or Not to AJAX &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#AlainTadros"&gt;&lt;em&gt;Lino Tadros &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; Ajax sometimes can be slower, really. Good talk and demos.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_3"&gt;Introduction to Test-Driven Development &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#StephenForte"&gt;&lt;em&gt;Stephen Forte &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; An introduction in TDD, One gem from it was Stephen telling us how to sell TDD to managers - just create regression bugs. Unfortunately Stephen did not tell that TDD is more about about design than testing but another presenter did that in a later session.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_4"&gt;Pragmatic ASP.NET Tips, Tricks, and Tools, Part 1 &lt;/a&gt;and &lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_5"&gt;Pragmatic ASP.NET Tips, Tricks, and Tools, Part 2 &lt;/a&gt;&lt;i&gt;by &lt;/i&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#JoelSemeniuk"&gt;&lt;em&gt;Steven Smith &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; some useful tips here. This was actually the most practical talk I attended.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_6"&gt;Designing for Testability &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#HadiHariri"&gt;&lt;em&gt;Hadi Hariri &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; very good lecture, though it did not turn as interactive as the presenter expected. I am becoming increasingly interested in inversion of control.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall2_8"&gt;SQL Reporting Services 2005 and What's New in 2008 &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#RemiCaron"&gt;&lt;em&gt;Remi Caron &lt;/em&gt;&lt;/a&gt;&lt;em&gt;- I&lt;/em&gt; had used RS 2005, but this talk was not for me. SQLRS is not the best tool at the market, but I guess it is popular in Microsoft shops.&lt;/li&gt;    &lt;li&gt;&lt;a href="http://www.devreach.com/Event/Sessions.aspx#hall4_8"&gt;Effective Risk Management With and Without Team Foundation Server 2008 &lt;/a&gt;&lt;em&gt;by &lt;/em&gt;&lt;a href="http://www.devreach.com/Event/Speakers.aspx#TadeuszGolonka"&gt;&lt;em&gt;Tadeusz Golonka &lt;/em&gt;&lt;/a&gt;&lt;em&gt;-&lt;/em&gt; the presenter English was really unique. There were a few good ideas how to measure and manage risk.&lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;&lt;strong&gt;NOTE&lt;/strong&gt;: I am pleased that for the first time I saw presenters who used ReSharper in their demos &lt;a href="http://www.devreach.com/Event/Speakers.aspx#JoelSemeniuk"&gt;&lt;em&gt;Steven Smith &lt;/em&gt;&lt;/a&gt; and &lt;a href="http://www.devreach.com/Event/Speakers.aspx#HadiHariri"&gt;&lt;em&gt;Hadi Hariri&lt;/em&gt;&lt;/a&gt;. Both of them used a dark scheme for VS.NET. Unfortunately people complained and they had to switch to the default colors.&lt;/p&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-207966519196534448?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/207966519196534448/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=207966519196534448&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/207966519196534448" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/207966519196534448" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/hgA_CpzEMSw/devreach-2008.html" title="DevReach 2008" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2008/10/devreach-2008.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-242568183634053713</id><published>2008-03-12T14:09:00.002+02:00</published><updated>2008-03-12T14:54:13.369+02:00</updated><title type="text">XmlWriter design flaws</title><content type="html">I was very surprised to see an &lt;span style="font-weight: bold;"&gt;XmlException &lt;/span&gt;(hexadecimal value... is invalid character) when using a &lt;span style="font-weight: bold;"&gt;XmlReader &lt;/span&gt;on a XML file that was generated using a &lt;span style="font-weight: bold;"&gt;XmlTextWriter&lt;/span&gt;. It turned out that the method &lt;span style="font-weight: bold;"&gt;WriteString&lt;/span&gt;(String) does not check for some special characters and an invalid XML document might get generated. See details &lt;a href="http://msdn2.microsoft.com/en-us/library/k1y7hyy9%28VS.71%29.aspx?topic=306132"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The recommended workaround was subclassing &lt;span style="font-weight: bold;"&gt;XmlTextWriter &lt;/span&gt;and overriding &lt;span style="font-weight: bold;"&gt;WriteString&lt;/span&gt;() to handle this characters (remove or substitute the invalid characters). &lt;span style="font-weight: bold;"&gt;XmlTextWriter &lt;/span&gt;constructors accept parameters like &lt;span style="font-weight: bold;"&gt;Stream&lt;/span&gt;, &lt;span style="font-weight: bold;"&gt;TextWriter&lt;/span&gt;, but there is also a static factory method &lt;span style="font-weight: bold;"&gt;XmlWriter.Create()&lt;/span&gt;, which has overloads that accept an optional &lt;span style="font-weight: bold;"&gt;XmlWriterSettings &lt;/span&gt;parameter. The weird thing is that if no &lt;span style="font-weight: bold;"&gt;XmlWriterSettings &lt;/span&gt;is specified, then the &lt;span style="font-weight: bold;"&gt;Settings &lt;/span&gt;property of the &lt;span style="font-weight: bold;"&gt;XmlWriter &lt;/span&gt;is null and can not be instantiated, since it is readonly. This means that there is no way to create a subclass (e.g. &lt;span style="font-weight: bold;"&gt;SafeXmlTextWriter&lt;/span&gt;), with initialized &lt;span style="font-weight: bold;"&gt;Settings &lt;/span&gt;property. So, if the default settings are not applicable to your situation... well, tough luck, you can not apply the easy fix using the override:&lt;br /&gt;&lt;br /&gt;public override void WriteString(String value)&lt;br /&gt;{&lt;br /&gt;    value = FixInvalidCharacters(value);&lt;br /&gt;    base.WriteString(value);&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-242568183634053713?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/242568183634053713/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=242568183634053713&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/242568183634053713" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/242568183634053713" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/MpXeamdDrPo/xmlwriter-design-flaws.html" title="XmlWriter design flaws" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2008/03/xmlwriter-design-flaws.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-4107330518429896697</id><published>2008-01-01T19:00:00.000+02:00</published><updated>2008-01-01T19:01:23.021+02:00</updated><title type="text">Summary of the year 2007</title><content type="html">&lt;p&gt;2007 seems a rather quiet year in my career (at least blogging-wise). But it  was quiet in a good way :)&lt;/p&gt; &lt;p&gt;It has been 1.5 years since I started working on &lt;a href="http://www.validata.co.uk/"&gt;Validata&lt;/a&gt; product and it continues to be  mentally stimulating and fun. The diverse technologies in the project and the  interesting problems keep me excited about my job. My company has joined a few  projects in the Balkans, so the week before Christmas, I had my first business  trip, ever. I went for Romania and next week I am going again.&lt;/p&gt; &lt;p&gt;I also have started a pet project that requires learning new stuff like  ActiveRecord, Monorail, MySql, JQuery and other good stuff. I really hope to  kick it off to a good start, while I am still on vacation. The more challenging  thing is to make it a habit to have progress each day, no matter how little it  is. I was somewhat unpleasantly surprised when I realized that it has been  almost 3 months of inactivity from my last refining of the project idea. But now  the project has stable foundations, there are no pending major technology  decisions, so the work might just flow...&lt;/p&gt; &lt;p&gt;I have been keeping up with the new .NET stuff mostly from reading my daily  doze of weblogs. I also attended a great seminar in Sofia in October, so the saw  is still being sharpened :)&lt;/p&gt; &lt;p&gt;I have continued to refine my toolbox and programming techniques. I find that  it's worth the temporary discomfort in learning how to use a new tool or  technique.&lt;/p&gt; &lt;p&gt;I have a good feeling about the new year. And I will try to make this a  self-fulfilling prophecy :)&lt;/p&gt;Have a great new year!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-4107330518429896697?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/4107330518429896697/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=4107330518429896697&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/4107330518429896697" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/4107330518429896697" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/W2P9WTU8ikU/summary-of-year-2007.html" title="Summary of the year 2007" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2008/01/summary-of-year-2007.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-1048303984343561747</id><published>2007-10-02T23:13:00.000+03:00</published><updated>2007-10-02T23:47:36.111+03:00</updated><title type="text">DevReach 2007, Sofia, Bulgaria (Day 2)</title><content type="html">Just a few quick notes about the session I visited in the Day 2 of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;DevReach&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall1_5"&gt;Why Partial Rendering Is Not AJAX&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Dino &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Esposito&lt;/span&gt;, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Another excellent talk by Dino. I finally cleared some misconceptions in my head about AJAX, partial rendering, update panels and all this stuff. This was a practical talk that will help me a lot when I do AJAX again (the first attempt was a bit unsuccessful, but you know AJAX is not for the faint-hearted).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall1_6"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;Silverlight&lt;/span&gt;, Flash on Steroids&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Lino &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;Tadros&lt;/span&gt;, Level 200&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;An excellent talk, by an honest and humorous speaker. Lino's &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;SL&lt;/span&gt; demo app was simple and well chosen. But &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;Silverlight&lt;/span&gt; is still nor ready for prime time, since the tools are lacking and there are some basic controls missing etc.. (well, when 1.1 is ready, I might take a look at it again).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall2_7"&gt;Being Smart About Database Design&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;Vladi&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;Tchalkov&lt;/span&gt;, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Very interesting talk about database design considerations:  normalization, domain tables, keys, temporal tables, optimizations.  One of the concepts I found very useful was one idea of how to implement temporal tables with a single table for the whole DB. One repeating thread in the talk was "know the rules so that you know how to break them properly".&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall4_8"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;RSS&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_9"&gt;Podcasting&lt;/span&gt;, and Syndication&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Carl Franklin, Level 200&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;A nice talk by the .NET Rocks host Carl Franklin. I learned about the &lt;a href="http://www.codeplex.com/Argotic/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Argotic&lt;/span&gt; &lt;/a&gt;.NET library. And Carl was very proud that his .NET rocks feed was valid, while the NY times was not (see &lt;a href="http://feedvalidator.org/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;FeedValidator&lt;/span&gt;&lt;/a&gt;) :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall2_9"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;LINQ&lt;/span&gt; - Deep Dive&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;Branimir&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;Giurov&lt;/span&gt;, Level 400&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;Branimir&lt;/span&gt; covered in detail all types of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_16"&gt;LINQ&lt;/span&gt; (for objects, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;datasets&lt;/span&gt;, &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_18"&gt;SQL&lt;/span&gt;, Entities, XML). He showed the cool debugging support. Good stuff, looking forward to using &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_19"&gt;LINQ&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall3_10"&gt;A Busy Developer's Guide to Building Windows &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_20"&gt;PowerShell&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_21"&gt;Cmdlets&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_22"&gt;Hristo&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_23"&gt;Deshev&lt;/span&gt;, Level 200&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;My friend &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_24"&gt;Hristo&lt;/span&gt; gave a very interesting talk about &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_25"&gt;PowerShell&lt;/span&gt; &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_26"&gt;Cmdlets&lt;/span&gt; (he is also writing a book on &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_27"&gt;PowerShell&lt;/span&gt;, so he knows his stuff). Those &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_28"&gt;Cmdlets&lt;/span&gt; are very fast to build and really powerful. I would like to play with them in case I have to do BAT commands or something more complex.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-1048303984343561747?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/1048303984343561747/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=1048303984343561747&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/1048303984343561747" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/1048303984343561747" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/HFiazboqcPg/devreach-2007-sofia-bulgaria-day-2.html" title="DevReach 2007, Sofia, Bulgaria (Day 2)" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/10/devreach-2007-sofia-bulgaria-day-2.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-6936142049336376609</id><published>2007-10-01T18:57:00.000+03:00</published><updated>2007-10-02T23:13:30.344+03:00</updated><title type="text">DevReach 2007, Sofia, Bulgaria (Day 1)</title><content type="html">I missed the first DevReach in 2006, but this year I made it to the conference. All of the speakers on Day 1 were really good and they captivated me till the end of each of the sessions. Here is a quick recap of the talks, that I visited.&lt;br /&gt;&lt;br /&gt;Side note: I don't know if it was just for the presentation, but none of the speakers that showed code in VS.NET had ReSharper installed. Just weird! :)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall4_1"&gt;Developers are from Mars, Managers are from Venus&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Chad Hower, Level 200&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I decided to start with a light and entertaining talk. I definitely got what I came for. Great slides, very humorous presentation... At one point in the presentation Chad asked his audience how many of us work for in a team of more than 10 people and only one guy (out of the fifty in the room) raised his hand. So, yes, there are very few projects that need heavyweight  methodologies meant for building the software analog of aircrafts. Chad said that giving names such as &lt;span style="font-style: italic;"&gt;lightweight &lt;/span&gt;vs &lt;span style="font-style: italic;"&gt;heavyweight &lt;/span&gt;is not very fair, so he used the terms &lt;span style="font-style: italic;"&gt;project-based&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;product-based &lt;/span&gt;methodologies (those were new ones for me).&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall4_2"&gt;Creating a billion dollar ERP system - case study of Velocity&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by John Waters, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;I didn't read the abstract of this talk and was a bit surprised (but in a pleasant way) that it was a very practical talk using a real code base. I finally understood what was the difference between ajax postbacks and ajax call. It was also useful to see how ajax works in practice, where does it make sense to use it and what is the cost of doing so.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall1_3"&gt;Challenging ASP.NET/AJAX for Braveheart Developers&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Dino Esposito, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Again I didn't read the abstract carefully and was surprised that the talk was about: HTTP handlers and modules. But this was a very interesting topic that I knew very little about (only ELMAH sounds familiar). Dino gave his talk very passionately and went without hesitation 10 minutes in the coffee break. One cool thing he showed was a HttpModule, that I think it was called ASPExlorer). It got activated by appending a parameter in the querystring "source=true" and it made the HTTP response return useful information about the requested page: its assembly file path, its dependencies, its source code, etc... Pretty cool way for troubleshooting in production environment.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://devreach.com/Event/Sessions.aspx#hall1_4"&gt;Scaling Habits of ASP.NET Applications&lt;/a&gt;&lt;br /&gt;&lt;em&gt;by Richard Campbell, Level 300&lt;/em&gt;&lt;br /&gt;&lt;br /&gt;Richard (whom I have listened to a lot in .NET Rocks) was probably the most eloquent and artistic speaker. He definitely knew his stuff, too. His session was definitely useful since I was unaware about a lot of stuff concerning ASP.NET scalability and performance. One quote worth remembering: "Computers are amplifiers - they just amplify the developer's intelligence or stupidity!"&lt;br /&gt;&lt;br /&gt;I am sure that the session in Day 2 will bring more good sessions (just like the ones today)...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-6936142049336376609?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/6936142049336376609/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=6936142049336376609&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/6936142049336376609" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/6936142049336376609" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/5seWr-srLgs/devreach-2007-sofia-bulgaria-day-1.html" title="DevReach 2007, Sofia, Bulgaria (Day 1)" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/10/devreach-2007-sofia-bulgaria-day-1.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-6455624275733593253</id><published>2007-07-06T17:18:00.000+03:00</published><updated>2007-09-23T23:43:57.296+03:00</updated><category scheme="http://www.blogger.com/atom/ns#" term=".net" /><title type="text">Blindspot: 'hh' vs 'HH'</title><content type="html">This is maddening! After working with .NET for more than 3 years, I just realized that I should be using &lt;span style="font-weight: bold;"&gt;HH &lt;/span&gt;(and not &lt;span style="font-weight: bold;"&gt;hh&lt;/span&gt;)&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;to show 0-24 hours in a formatted &lt;span style="font-style: italic;"&gt;DateTime&lt;/span&gt;. It is weird how I held this misconception for such a long time. If my workdays were from 00:00 to 12:00, then this could be justified, but that's definitely not the case...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-6455624275733593253?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/6455624275733593253/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=6455624275733593253&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/6455624275733593253" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/6455624275733593253" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/3hfTraVEvuI/blindspot-hh-vs-hh.html" title="Blindspot: 'hh' vs 'HH'" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/07/blindspot-hh-vs-hh.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-4492047259361574550</id><published>2007-06-29T14:37:00.000+03:00</published><updated>2007-06-29T15:32:56.492+03:00</updated><title type="text">Do you like surprises?</title><content type="html">Tony Robbins asked his audience in &lt;a href="http://www.ted.com/index.php/talks/view/id/96"&gt;a TED talk&lt;/a&gt; if they like surprises. He received a resounding "YEAH", but he continued with the comment: "BULL****, people like only the surprises they expect". Let me tell you about two developer's surprises from yesterday (I guess, I didn't like those much):&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Javascript Surprise:&lt;/span&gt; In a ASP.NET project I had to implement a client-side filtering of table rows. I registered a javascript array with values to be compared. Since it was very slow I decided to sort the array server-side and use binary search client-side. The script ran much faster, but in some cases it didn't work as expected. The surprise factor turned out to be that .NET and javascript did string comparison in different way, so the array was not sorted correctly ("A" &lt; "b" in .NET but"A" &gt; "b" in Javascript).&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Oracle Surprise:&lt;/span&gt; I use &lt;span style="font-style: italic;"&gt;tnsnames.ora&lt;/span&gt; to connect to Oracle and &lt;span style="font-style: italic;"&gt;tnsping.exe&lt;/span&gt; tells me to what service I am currently connected to. It turned out that this is not always reliable if you have multiple tnsnames.ora. So, I have been working for quite a long time on a database that was not the one I expected. More info on the topic &lt;a href="http://catherinedevlin.blogspot.com/2006/10/oracle-net-unaccountability.html"&gt;here &lt;/a&gt;and &lt;a href="http://www.dbforums.com/archive/index.php/t-1298850.html"&gt;here&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The developer's job is not short of surprises, so better approach them with eagerness or join a club like &lt;a href="http://forums.worsethanfailure.com/forums/thread/25910.aspx"&gt;this one&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-4492047259361574550?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/4492047259361574550/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=4492047259361574550&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/4492047259361574550" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/4492047259361574550" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/-7sMcQg18Yg/do-you-like-surprises.html" title="Do you like surprises?" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/06/do-you-like-surprises.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-4842018777537587243</id><published>2007-06-22T18:18:00.001+03:00</published><updated>2007-07-06T15:39:26.011+03:00</updated><title type="text">Becoming VS.NET Keyboard Jedi</title><content type="html">After improving my general typing speed, getting more comfortable with the keybaord and obtaining a MS Natural Ergo 4000 keyboard, the next step to increase my productivity at work is to do more in VS.NET without using the mouse device.&lt;br /&gt;&lt;br /&gt;I will need some discipline to leave the mouse navigation habit behind, but I think it will be worth it. The preconditions for a successful migration are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Roy's &lt;a href="http://weblogs.asp.net/rosherove/archive/2007/06/03/train-to-be-a-keyboard-master-with-keyboard-jedi.aspx"&gt;Keyboard Jedi&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Learning the shortcuts: VS.NET and &lt;a href="http://www.jetbrains.com/resharper/documentation/20_DefaultKeymap.pdf"&gt;Resharper&lt;/a&gt;&lt;/li&gt;&lt;li&gt;One week commitment - if I don't feel comfortable in a week with the keys, I don't plan to be extra stubborn&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;I will report on my progress next Friday :)&lt;br /&gt;&lt;br /&gt;UPDATE: Next Friday's report: It turned out that I found it impractical to abandon the mouse completely. In a lot of cases reaching to the mouse was easier: navigating through various VS.NET windows, running rarely-used commands, etc. On the bright side, I succeeded to replace some mouse movements with the corresponding key strokes both in VS.NET and in other applications. Now I find it natural to navigate through text and select text with the keyboard.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-4842018777537587243?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/4842018777537587243/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=4842018777537587243&amp;isPopup=true" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/4842018777537587243" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/4842018777537587243" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/HjM4aNDWKBQ/becoming-vsnet-keyboard-jedi.html" title="Becoming VS.NET Keyboard Jedi" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/06/becoming-vsnet-keyboard-jedi.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-294270749015428170</id><published>2007-04-01T01:08:00.000+03:00</published><updated>2007-04-01T01:23:38.047+03:00</updated><title type="text">Cool: Design Your T-Shirt Online</title><content type="html">I just stumbled upon a great site &lt;a href="http://www.click-shirt.com/"&gt;http://www.click-shirt.com/&lt;/a&gt; where you can design your own T-Shirt online with an amazing Flash &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;interface&lt;/span&gt; - it puts you in a creative mood, right away.&lt;br /&gt;&lt;br /&gt;I could not help it and started with a standard template. In 10 minutes came up with this crazy T-Shirt design...&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_wuDhHfQy0oA/Rg7cTsC4iBI/AAAAAAAAAAM/BYKfT2jHpac/s1600-h/myT-Shirt.JPG"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 357px; height: 208px;" src="http://3.bp.blogspot.com/_wuDhHfQy0oA/Rg7cTsC4iBI/AAAAAAAAAAM/BYKfT2jHpac/s320/myT-Shirt.JPG" alt="" id="BLOGGER_PHOTO_ID_5048214463127783442" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Don't ask what all of this means! There is a deep and profound explanation for each of the symbols, letters, graphics you see, but I am yet to figure it out... &lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;Hmm&lt;/span&gt;, I better get some sleep and in the morning I may censor this post, since it is way off topic. But on the other hand it supports may intention to start adding more visual elements to my posts, so I'll better leave it here as a reminder.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-294270749015428170?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/294270749015428170/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=294270749015428170&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/294270749015428170" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/294270749015428170" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/DtqZuXR2mFY/cool-design-your-t-shirt-online.html" title="Cool: Design Your T-Shirt Online" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_wuDhHfQy0oA/Rg7cTsC4iBI/AAAAAAAAAAM/BYKfT2jHpac/s72-c/myT-Shirt.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/04/cool-design-your-t-shirt-online.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-4133812849541185024</id><published>2007-03-24T12:02:00.000+02:00</published><updated>2007-03-24T12:42:01.346+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.NET" /><title type="text">Controlling the number of active users of an ASP.NET application</title><content type="html">Last week out team had to implement a requirement that limits the number of concurrent active users of an ASP.NET application. In order to deal with concurrent users, there should be a continuous interaction between the user and the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_0"&gt;application&lt;/span&gt;, which does not match very well the essence of &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;web&lt;/span&gt; applications: request-response. Since our app is meant to be an intranet application (used mostly like a desktop app), such a &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;licensing&lt;/span&gt; scheme makes some sense. And the concept of an ASP.NET session denotes a continuous communication, so it provided a good way of determining who is an active user and who is not.&lt;br /&gt;&lt;br /&gt;I was surprised that I could not find a way to directly control the active ASP.NET sessions - e.g. kill a session (by its &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;SessionID&lt;/span&gt;), get the session data, etc. As a workaround, we used a two-step process: keep the IDs of the active sessions in a "session manager" and when some event occurs (e.g. the max number of concurrent users is reached) mark a session "to be killed". That's how the next request from a "to be killed" session, forces the session to be abandoned.&lt;br /&gt;&lt;br /&gt;This schema worked nicely, until we noticed that closing the browser and reopening it again caused a new session to be registered in our "session manager". The previous one remained alive since the ASP.NET application did not know that the user had closed his browser (ASP.NET session ID cookie is stored only in browser memory, so it gets lost). So we came up with another workaround and used a persistent cookie to identify that the user has finished a session and started a new one.&lt;br /&gt;&lt;br /&gt;The thing that I don't quite like, is that we started with a simple problem and developed a pretty complex solution. I wonder if there was a more elegant way to deal with the concurrent users issue.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-4133812849541185024?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/4133812849541185024/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=4133812849541185024&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/4133812849541185024" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/4133812849541185024" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/OZRdR6jA1mM/controlling-number-of-active-users-of.html" title="Controlling the number of active users of an ASP.NET application" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/03/controlling-number-of-active-users-of.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-117371554999849111</id><published>2007-03-12T19:05:00.000+02:00</published><updated>2007-03-15T12:27:00.441+02:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="vs.net" /><title type="text">VS.NET 2005 Macro For Removing Unnecessary Projects From A Solution</title><content type="html">&lt;p&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;I usually work with a pretty large VS.NET solution. Currently It contains 60 projects and I don't need them all of the time. To ease the solution loading and help VS.NET add-ins like ReSharper load and function faster, it is a good idea to split this solution into several smaller ones. Since the projects interdependencies are not that simple, I decided to automate the process of creating the smaller solutions. &lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;The macro below finds all projects referenced of the selected ones and removes the other projects from the solution. Then you one can do "Save as" and use the shrinked solution. U&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;se &lt;strong&gt;ShowAllReferencedProjects&lt;/strong&gt;() for displaying the projects that will remain after the operation and &lt;strong&gt;RemoveAllProjectsUnusedByActiveProjects&lt;/strong&gt;() for the actual removal (you will be asked if you are sure you want to do that).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Note&lt;/strong&gt;: Excuse my VB, I have not exercised my VB skills, since doing some VB6 coding more than two years ago. The part that was most fun and challenging was not VB, but exploring the VS.NET object model - surprisingly the resources on this topic were a little scarce.&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;&lt;strong&gt;Disclaimer&lt;/strong&gt;: Use the code at your own risk! (well, it can't really do much harm, since it does not save the solution automatically).&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;&lt;span style="color:#000000;"&gt;&lt;span style="color:#ff0000;"&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;&lt;/span&gt;: Well, actually  &lt;strong&gt;RemoveAllProjectsUnusedByActiveProjects() &lt;/strong&gt;can affect some of  the project files, since the order of removal turned out to be important  (removing a referenced projects, shortens the reference lists of other project).  This issue is fixable, but currently I don't have the time to fix it :) Moreover  the operation is very slow so it might be easier to add projects to a blank  solution instead of removing them from existing solution. Actually, the best way to handle  this task is on a file level, where you need a parser for solution and  project files. Parsing those files will not be that trivial and I had not  been able to find such parsers online. Looks like a good idea for a pet project :)&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; System&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; EnvDTE&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; EnvDTE80&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; System.Collections.Generic&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; System.Diagnostics&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Imports&lt;/span&gt; System.Windows.Forms&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 255);"&gt;Public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Module&lt;/span&gt; VsProjectsManagement&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; RemoveAllProjectsUnusedByActiveProjects()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; unusedProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject) = FindAllProjectsUnusedByActiveProjects()&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; unusedProjects.Count = 0 &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;            MessageBox.Show(&lt;span style="color: rgb(128, 0, 0);"&gt;"There are no unused projects for the current project selection"&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;Exit&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; s &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;br /&gt;&lt;/span&gt;        s = &lt;span style="color: rgb(128, 0, 0);"&gt;"Do you want to remove the following "&lt;/span&gt; &amp; unusedProjects.Count &amp;amp; &lt;span style="color: rgb(128, 0, 0);"&gt;" projects from the solution: "&lt;/span&gt; _&lt;br /&gt;            &amp; GetProjectNames(unusedProjects) &amp;amp; &lt;span style="color: rgb(128, 0, 0);"&gt;"?"&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; DialogResult.Yes = MessageBox.Show(s, &lt;span style="color: rgb(128, 0, 0);"&gt;"Unused projects removal"&lt;/span&gt;, MessageBoxButtons.YesNo, MessageBoxIcon.Question) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;Exit&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        RemoveProjectsFromSolution(unusedProjects)&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Public&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; ShowAllReferencedProjects()&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; usedProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        usedProjects = FindAllProjectsReferencedByActiveProjects()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; s &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;br /&gt;&lt;/span&gt;        s = &lt;span style="color: rgb(128, 0, 0);"&gt;"The selected project(s) reference total of "&lt;/span&gt; &amp; &lt;span style="color: rgb(0, 0, 255);"&gt;CStr&lt;/span&gt;(usedProjects.Count) _&lt;br /&gt;             &amp; &lt;span style="color: rgb(128, 0, 0);"&gt;" projects in the solution: "&lt;/span&gt; &amp; GetProjectNames(usedProjects)&lt;br /&gt;&lt;br /&gt;        MessageBox.Show(s, &lt;span style="color: rgb(128, 0, 0);"&gt;"Referenced projects"&lt;/span&gt;)&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; RemoveProjectsFromSolution(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; projects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject))&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; projects&lt;br /&gt;            DTE.Solution.Remove(vsProject.Project)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; GetProjectNames(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; projects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)) &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; projectNames &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;) = &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;)(projects.Count)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; projects&lt;br /&gt;            projectNames.Add(&lt;span style="color: rgb(128, 0, 0);"&gt;"'"&lt;/span&gt; &amp; vsProject.Project.Name &amp;amp; &lt;span style="color: rgb(128, 0, 0);"&gt;"'"&lt;/span&gt;)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        projectNames.Sort()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;String&lt;/span&gt;.Join(&lt;span style="color: rgb(128, 0, 0);"&gt;", "&lt;/span&gt;, projectNames.ToArray())&lt;br /&gt;&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; FindAllProjectsUnusedByActiveProjects() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; allVsProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject&lt;br /&gt;&lt;br /&gt;        allVsProjects = FindAllVsProjectsInSolution()&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; (allVsProjects.Count = 0) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;            Debug.WriteLine(&lt;span style="color: rgb(128, 0, 0);"&gt;"There are no Projects In Solution"&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;Exit&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; allActiveAndReferencedProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        allActiveAndReferencedProject = FindAllProjectsReferencedByActiveProjects()&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; DifferenceProjects(allVsProjects, allActiveAndReferencedProject)&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; DifferenceProjects(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; mainSet &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject), &lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; setToRemove &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)) &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; resultSet &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; mainSet&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; setToRemove.Contains(vsProject) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                resultSet.Add(vsProject)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; resultSet&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; FindAllProjectsReferencedByActiveProjects() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; activeVSProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; allActiveAndReferencedProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject&lt;br /&gt;&lt;br /&gt;        activeVSProjects = FindAllActiveVsProjects()&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; (activeVSProjects.Count = 0) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;            Debug.WriteLine(&lt;span style="color: rgb(128, 0, 0);"&gt;"Please select one or more projects in the solution"&lt;/span&gt;)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;Exit&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;' fill first the initial selected projects&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; activeVSProjects&lt;br /&gt;            allActiveAndReferencedProject.Add(vsProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 128, 0);"&gt;' find all referenced projects recursively&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; vsProject &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; activeVSProjects&lt;br /&gt;            FindAndFillReferencedProjects(vsProject, allActiveAndReferencedProject)&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; allActiveAndReferencedProject&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; FindAllVsProjectsInSolution() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; usedVSProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; proj &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; Project &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; DTE.Solution.Projects&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;TypeOf&lt;/span&gt; proj.Object &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                usedVSProjects.Add(proj.Object)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; usedVSProjects&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;/span&gt; FindAllActiveVsProjects() &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; usedVSProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;New&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject)&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; proj &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; Project &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; DTE.ActiveSolutionProjects()&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;TypeOf&lt;/span&gt; proj.Object &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                usedVSProjects.Add(proj.Object)&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Return&lt;/span&gt; usedVSProjects&lt;br /&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Function&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;/span&gt; FindAndFillReferencedProjects(&lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; objVSProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject, &lt;span style="color: rgb(0, 0, 255);"&gt;ByVal&lt;/span&gt; usedVSProjects &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; List(&lt;span style="color: rgb(0, 0, 255);"&gt;Of&lt;/span&gt; VSLangProj.VSProject))&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; referencedVSProject &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.VSProject&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Dim&lt;/span&gt; proj &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; Project&lt;br /&gt;&lt;br /&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;For&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Each&lt;/span&gt; objReference &lt;span style="color: rgb(0, 0, 255);"&gt;As&lt;/span&gt; VSLangProj.Reference &lt;span style="color: rgb(0, 0, 255);"&gt;In&lt;/span&gt; objVSProject.References&lt;br /&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; objReference.Type = VSLangProj.prjReferenceType.prjReferenceTypeAssembly &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                proj = objReference.SourceProject&lt;br /&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; proj &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Nothing&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                    &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;TypeOf&lt;/span&gt; proj.Object &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; VSLangProj.VSProject &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                        referencedVSProject = proj.Object&lt;br /&gt;                        &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; referencedVSProject &lt;span style="color: rgb(0, 0, 255);"&gt;Is&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Nothing&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                            &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Not&lt;/span&gt; usedVSProjects.Contains(referencedVSProject) &lt;span style="color: rgb(0, 0, 255);"&gt;Then&lt;br /&gt;&lt;/span&gt;                                &lt;span style="color: rgb(0, 128, 0);"&gt;' Add current and recursively add the others&lt;br /&gt;&lt;/span&gt;                                usedVSProjects.Add(referencedVSProject)&lt;br /&gt;                                FindAndFillReferencedProjects(referencedVSProject, usedVSProjects)&lt;br /&gt;                            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;                        &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;                    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;                &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;            &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;If&lt;br /&gt;&lt;/span&gt;        &lt;span style="color: rgb(0, 0, 255);"&gt;Next&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;span style="color: rgb(0, 0, 255);"&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Sub&lt;br /&gt;&lt;br /&gt;End&lt;/span&gt; &lt;span style="color: rgb(0, 0, 255);"&gt;Module&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-117371554999849111?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/117371554999849111/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=117371554999849111&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/117371554999849111" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/117371554999849111" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/VGad5D6K0iY/vsnet-2005-macro-for-removing.html" title="VS.NET 2005 Macro For Removing Unnecessary Projects From A Solution" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/03/vsnet-2005-macro-for-removing.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116835522659706002</id><published>2007-01-09T17:07:00.000+02:00</published><updated>2007-02-01T19:38:56.706+02:00</updated><title type="text">Counting Tools</title><content type="html">&lt;p&gt;At work, I&amp;nbsp;employ a myriad of tools to get my job done, and I&amp;nbsp;am always trying to&amp;nbsp;add new goodies to my toolbox.&amp;nbsp;Naturally&amp;nbsp;some of the programs I try just don't prove useful enough&amp;nbsp;to stay around for long. To keep my system tidy (mission impossible), occasionally I run &lt;a href="http://www.nirsoft.net/"&gt;MyUninstaller&lt;/a&gt;&amp;nbsp;to remind myself what applications I have installed and eventually&amp;nbsp;remove&amp;nbsp;the ones that I will never use. Recently I noticed&amp;nbsp;that there are 300 installed items (but excluding the security updates there are about&amp;nbsp;200 applications). Since those are only the tools that had been&amp;nbsp;installed using MSI, I guess, that the actual app count is actually greater than 300 (most likely about 400).&lt;/p&gt; &lt;p&gt;But if this post can be useful for anybody, I better include links to&amp;nbsp;some of my recent additions to my toolbox:&lt;/p&gt; &lt;p&gt;Today I liked a&amp;nbsp;bunch of tiny useful apps from &lt;a href="http://www.donationcoder.com/Software/Skrommel/"&gt;donationcoder&lt;/a&gt;&amp;nbsp;(the list on the site is huge, but only a few apps have a chance to prove useful):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;CAPshift - Ever hit caps lock by accident and not found out until half a page later? CAPshift extends the Caps Lock key by slowing it down, and shows a menu to change the selected text to lowercase, UPPERCASE, TitleCase, iNVERTEDcASE, RaNDoMCaSE or to Replace user defined characters.&lt;/li&gt; &lt;li&gt;StartClock - Shows the current time in the start button.&lt;/li&gt; &lt;li&gt;OpeningHours - Runs a program when inside a certain time interval, and closes it when outside.&lt;/li&gt; &lt;li&gt;LabelControl - Overlays buttons and other controls with a Number for direct access via Ctrl-Number.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Other great tools that deserve&amp;nbsp;mentioning are:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://tools.tortoisesvn.net/StExBar"&gt;StExBar&lt;/a&gt; - The StExBar provides many useful commands for your everyday use of Windows explorer.&amp;nbsp;&lt;em&gt;The best feature&amp;nbsp;is having&amp;nbsp;Ctl+Shift+C for copying path of the selected file.&lt;/em&gt;&lt;/li&gt; &lt;li&gt;&lt;a href="http://windirstat.info/"&gt;WinDirStat&lt;/a&gt; - WinDirStat is a disk usage statistics viewer and cleanup tool for Microsoft Windows. &lt;em&gt;It is just the best free tool I have tried and it helped me make some space on my disk.&lt;/em&gt;&lt;/li&gt;&lt;/ul&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;And let's throw in&amp;nbsp;some good recent additions to my ever-growing&amp;nbsp;list of killer&amp;nbsp;Firefox extensions:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://roachfiend.com"&gt;ErrorZilla&lt;/a&gt; 0.2 - Implements useful error pages.&lt;/li&gt; &lt;li&gt;&lt;a href="http://conlan89.googlepages.com/"&gt;Link Alert&lt;/a&gt; 0.6.2 - Changes the cursor to indicate the target of a link.&lt;/li&gt; &lt;li&gt;&lt;a href="http://yellow5.us/firefox/linkification/"&gt;Linkification&lt;/a&gt; 1.3.1 - Converts text links into genuine, clickable links.&lt;/li&gt; &lt;li&gt;&lt;a href="http://www.cusser.net"&gt;Disable Targets For Downloads&lt;/a&gt; 1.0.1 - Prevents download links opening a blank window.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116835522659706002?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/116835522659706002/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=116835522659706002&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116835522659706002" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116835522659706002" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/OE8tnHR0Lp0/counting-tools.html" title="Counting Tools" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/01/counting-tools.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116765878464969517</id><published>2007-01-01T15:39:00.000+02:00</published><updated>2007-01-03T18:36:05.210+02:00</updated><title type="text">Summary of the year 2006</title><content type="html">&lt;p&gt;It is already a &lt;a href="http://immitev.blogspot.com/2006/01/summary-of-year-2005.html"&gt;tradition&lt;/a&gt; to do an opening post that sums up what I have been up to in my professional development in the past year. &lt;/p&gt; &lt;p&gt;It was a pretty interesting year! Finishing off my first project for my (not so new) company, completing another &lt;a href="http://immitev.blogspot.com/2006/03/surprise-project.html"&gt;small one&lt;/a&gt;, and joining a long-term &lt;a href="http://immitev.blogspot.com/2006/05/first-impressions-of-new-project.html"&gt;challenging project&lt;/a&gt; (the biggest one in my career). And some &lt;a href="http://immitev.blogspot.com/2006/02/coding4fun-scheduled-wav-player.html"&gt;coding 4 fun&lt;/a&gt; :)&lt;/p&gt; &lt;p&gt;The biggest change for me this year was entering the world of web programming. ASP.NET made the transition from desktop to web programming pretty smooth, but still there is so much too learn. Using .NET 2.0 and VS.NET 2005 for nearly a full year was valuable experience as well and a pretty enjoyable one, as well.&lt;/p&gt; &lt;p&gt;My skill improvements program this year included learning &lt;a href="http://immitev.blogspot.com/2006/02/touch-typing-week-9-overview.html"&gt;touch typing&lt;/a&gt;. I think that the hours invested in it already paid off pretty well.&lt;/p&gt; &lt;p&gt;A couple of computer books that I read and found interesting were &lt;a href="http://immitev.blogspot.com/2006/01/working-effectively-with-legacy-code.html"&gt;Working Effectively With Legacy Code&lt;/a&gt; and &lt;a href="http://immitev.blogspot.com/2006/01/balancing-agility-and-discipline-book.html"&gt;Balancing Agility And Discipline&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I also kept investing a lot of time to improve my tools at work (see &lt;a href="http://immitev.blogspot.com/2006/02/launchers-revisited-again.html"&gt;here&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/05/vsnet-productivity-add-ins-revisited.html"&gt;here&lt;/a&gt;, &lt;a href="http://immitev.blogspot.com/2006/05/replacing-windows-programs.html"&gt;here&lt;/a&gt; and &lt;a href="http://immitev.blogspot.com/2006/06/desktop-search-tools_29.html"&gt;here&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;I have neglected blogging recently since I am prefer to focus on other activities, but this blog is by no means dead. Reducing the fluff and getting to the stuff. Still, I am still an avid blog reader.&lt;/p&gt; &lt;p&gt;I wish everyone a happy, fun, prosperous new year!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116765878464969517?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/116765878464969517/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=116765878464969517&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116765878464969517" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116765878464969517" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/uEy6Br9vlsE/summary-of-year-2006.html" title="Summary of the year 2006" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2007/01/summary-of-year-2006.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116291925761612658</id><published>2006-11-07T19:07:00.000+02:00</published><updated>2006-11-07T19:07:37.766+02:00</updated><title type="text">ReSharper 2.5 rulez</title><content type="html">&lt;p&gt;I am very impressed with the latest ReSharper EAP build, and the &lt;a href="http://www.jetbrains.net/confluence/display/ReSharper/ReSharper+2.5+Roadmap"&gt;roadmap&lt;/a&gt; looks very promising. I especially like the:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Improved find results view  &lt;li&gt;Improved Control+F12 behaviour (I was a fan of Visual Assist Alt + M , but this is even better).  &lt;li&gt;Enhanced context actions and quickfixes (I took a picture of numerous context actions in a single &amp;lt;pretty awful&amp;gt;&amp;nbsp;.cs file)&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://img293.imageshack.us/my.php?image=resharper25contextsn1.png" target="_blank"&gt;&lt;img alt="Free Image Hosting at www.ImageShack.us" src="http://img293.imageshack.us/img293/5520/resharper25contextsn1.th.png" border="0"&gt;&lt;/a&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;More goodies to come! The planned&amp;nbsp;performance improvements are good news since this is the single reason I sometimes turn Resharpet off.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116291925761612658?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/116291925761612658/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=116291925761612658&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116291925761612658" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116291925761612658" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/Ci4TB2TA_2k/resharper-25-rulez.html" title="ReSharper 2.5 rulez" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2006/11/resharper-25-rulez.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116147347113319627</id><published>2006-10-22T02:31:00.000+03:00</published><updated>2006-10-22T02:31:11.276+03:00</updated><title type="text">Unimaginable, stupid bug</title><content type="html">Yesterday I had a crazy debugging session on a simple code that just refused to work. I had a listbox which I wanted to databind to a list of objects. I set its DataSource, but the listbox remained empty. So I began thinking and experimenting:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Maybe the data binding code is somehow wrong? I searched and tried at least four other approaches to databind the list - still empty.&lt;/li&gt;&lt;li&gt;I added the objects to the listbox items collection one by one (no databinding) - still empty.&lt;/li&gt;&lt;li&gt;I added a few random strings to the items collection (the simplest case) - still empty.&lt;/li&gt;&lt;/ol&gt;Debugging the code revealed that the listbox had the proper items, but somehow they were not displayed. Pure evil! I inspected every reference to the listbox to see if I messed up something without intention. I also looked at all properties related to its visual behaviour. Everything seemed OK.&lt;br /&gt;&lt;br /&gt;In desperation I did a little experiment to try to isolate the problem - binding another listbox to another array of object. It worked fine, so I realized that the cause of the problem should be something really stupid. You bet, I was right. &lt;i&gt;&lt;br /&gt;&lt;br /&gt;There was another listbox above mine, which I had accidentally added to the form, and it was hiding it completely&lt;/i&gt;. &lt;br /&gt;&lt;br /&gt;Those evil listbox was never filled with items, so no wonder it was empty. Spending more than an hour on something like this can really be a pain when you you are racing against a deadline, as it was in this case...&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116147347113319627?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/116147347113319627/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=116147347113319627&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116147347113319627" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116147347113319627" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/cZ-BsLHi_r8/unimaginable-stupid-bug.html" title="Unimaginable, stupid bug" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2006/10/unimaginable-stupid-bug.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116117545934170271</id><published>2006-10-18T15:44:00.000+03:00</published><updated>2006-10-18T15:44:25.540+03:00</updated><title type="text">A Closer NUnit Relationship</title><content type="html">&lt;p&gt;I had used NUnit in all of my .NET projects so far, but now I have the chance to become a superuser. We plan to add NUnit integration in our product. I won't go into much detail here, but the idea is that our application will execute NUnit test cases and the results will be saved in a format that is used in our app.&lt;/p&gt; &lt;p&gt;The problem that I face right now is that I hoped that I could use nunit-console to run a test case, but there is no such an option.&amp;nbsp;The atomic unit for execution is a test fixture. Argh, why is this option missing? I doubt it that it was much difficult, since &lt;a href="http://www.adapdev.com/zanebug/1.6.0/ar01s03.html#d0e867"&gt;Zanebug console runner&lt;/a&gt; already has such a feature. So what are my options now:&lt;/p&gt; &lt;ol&gt; &lt;li&gt;Use Zanebug (it claims to have NUnit 2.2.7 support)  &lt;li&gt;Search for a better nunit-console replacement (if anybody knows about one, please let me know, btw &lt;a href="http://www.mertner.com/confluence/display/MbUnit/TestExecutionUsingConsoleApplication"&gt;MbUnit console app&lt;/a&gt; options are very limited, too)  &lt;li&gt;Develop a custom nunit-console replacement that fits our needs (probably based on&amp;nbsp;nunit-console code).&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;I hoped I could use the standard nunit-console app, since I would not have to learn the API intricacies and deal with breaking changes in future NUnit versions, but it seems that I am screwed :) &lt;/p&gt; &lt;p&gt;Another problem that I can foresee, is that running multiple test cases one by one, can cause a performance problem if the assembly is loaded and unloaded on each execution. Might be a good idea to come up with a workaround.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116117545934170271?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/116117545934170271/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=116117545934170271&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116117545934170271" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116117545934170271" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/3xRACRztj4U/closer-nunit-relationship.html" title="A Closer NUnit Relationship" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2006/10/closer-nunit-relationship.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-116003496288697556</id><published>2006-10-05T10:56:00.000+03:00</published><updated>2006-10-05T10:56:02.930+03:00</updated><title type="text">What I have been doing for a month</title><content type="html">As I mentioned in a previous &lt;a href="http://immitev.blogspot.com/2006/09/spying-on-myself.html"&gt;post&lt;/a&gt;, I use &lt;a href="http://www.workingprogram.com/qlockwork.html"&gt;QlockWork &lt;/a&gt;to track my activities at work. They had just released version 1.2.0 that fixed a problem that prevented me doing reports. So the first thing I did, after I installed the newest version, was to the a report by application for the last month. Here are the results:&lt;br /&gt;&lt;br /&gt;50% Microsoft Visual Studio 2005&lt;br /&gt;15% Microsoft Outlook&lt;br /&gt;8% Mozilla Firefox&lt;br /&gt;6% Trillian&lt;br /&gt;3% RSS Bandit&lt;br /&gt;3% Windows Explorer&lt;br /&gt;15% Various applications (about 30 of them)&lt;br /&gt;&lt;br /&gt;Am I surprised? Well, I expected VS.NET to have a little more share (though it is defiinitely not my only development tool - the other 30 apps in the various section are a part of my toolbox). Spending 15% in Outlook (10% of which writing) has surpassed my estimations a little - I was expecting 5% less. And spending just 3% in RSS Bandit look like maybe I am not investing enough time on staying up current and well-informed.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-116003496288697556?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/116003496288697556/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=116003496288697556&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116003496288697556" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/116003496288697556" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/TVzUysKV4FY/what-i-have-been-doing-for-month.html" title="What I have been doing for a month" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2006/10/what-i-have-been-doing-for-month.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115960906060045886</id><published>2006-09-30T12:37:00.000+03:00</published><updated>2006-10-01T22:05:40.290+03:00</updated><title type="text">Refactoring Code - How Do You Know You Are Not Breaking It</title><content type="html">UPDATE: The title of the post should have been "The Cost and Benefits of Emotion-Driven Code Improvements", but since this was an emotional and not well prepared post, I screwed it :) This is the third draft, and finally it looks understandable...&lt;br /&gt;&lt;br /&gt;Last Saturday I felt a strange urge to go to the office and to finish what I had started the previous day. Basically I was frustrated by working with poorly formatted and commented code, that did not follow naming conventions and other good practices. I had also noticed a few flaws in some parts of the code, such as not guarding for exception between IDataReader's Open() and Close() methods (which was easily fixed by enclosing the reader within a &lt;i&gt;using &lt;/i&gt;region) and other exception handling problems.&lt;br /&gt;&lt;br /&gt;I thought that (in the long run) me and the whole team will be spending much more time and energy understanding such code, than the time and energy I wanted to spend to fix it. Yeah, &lt;a href="http://www.codinghorror.com/blog/archives/000684.html"&gt;most of the developer's time is spent reading the code&lt;/a&gt;. With the help of my beloved ReSharper, I reformatted all the code in one of the projects in the solution by fixing spacing, shortening references, removing unnecessary &lt;i&gt;this &lt;/i&gt;qualifiers, removing unused code. Then I did some manual whitespace formatting and finally applied the functional fixes in the code. I did all those things in a single session intending to perform a single checking-in. And you better believe that later it turned out that it is impossible to quickly find what the functional changes were.  No diff tool is that clever to show only the differences that can affect the behaviour of the program.&lt;br /&gt;&lt;br /&gt;&lt;i&gt;&lt;span style="font-weight: bold;"&gt;Lesson learned&lt;/span&gt;:&lt;/i&gt; Separate concerns, do one thing at a time, and checkin after it is completed.&lt;br /&gt;&lt;br /&gt;I waited till Monday for the check-in, in order to get the approval of my PM, since this was not a planned operation. I was not surprised to hear that he was not very enthusiastic about such major code changes - every single file of a project with about 60 files was modified. He asked one of my colleagues to do a review of the changes. I had to explain that this is not as easy as it sounds and I offered an approach that would eliminate the non functional code changes altogether, by looking directly at the generated IL. Well, not the ugly IL itself, but better the output of its decompilation (of course, using Reflector).&lt;br /&gt;&lt;br /&gt;I remembered that there is a Reflector addin, called &lt;a href="http://www.codingsanity.com/diff.htm"&gt;Reflector Diff&lt;/a&gt;. It works very well, but only on per method basis, so it was virtually impossible to inspect all functional changes in a reasonable amount of time. We ended up using a statistical approach, examining just a couple of files and generalizing about the quality of the changes, heh :) Later I got some better ideas, but it was too late: (a) Decompile the old version and the new version of the assembly in separate folders with &lt;a href="http://www.denisbauer.com/NETTools/FileDisassembler.aspx"&gt;Reflector.FileDisassembler &lt;/a&gt;and diff them with a tool that supports folder diffs (like my favorite &lt;a href="http://winmerge.org/"&gt;WinMerge&lt;/a&gt;). (b) Automatically reformat the old code with Resharper and then diff all the files in the folder.&lt;br /&gt;&lt;br /&gt;&lt;i style="font-weight: bold;"&gt;Lesson learned:&lt;/i&gt; After making a mistake, there is often still a chance to find a good enough workaround.  So know your tools and use them creatively.&lt;br /&gt;&lt;br /&gt;After my code changes got approved, I tried to check-in them. Surprisingly it turned out that 3 of the files were already modified by other people and I was faced with the difficult task of merging them. I am not sure how this happened, I am pretty sure that when starting editing a non checked out file, VS.NET takes care to get its latest version before checking it out.&lt;br /&gt;&lt;br /&gt;Unfortunately these were one of the files with the most functional changes in them. The automatic VSS merge naturally could not handle such major changes, so I had to perform it manually. What I did was to find out what the other people's changes were and apply them one by one. I had to be extra careful, so it took two more hours to get it done.&lt;br /&gt;&lt;br /&gt;But there were more surprises in store. During the checkin process I was shown the default VSS merging screen to merge the changes. I knew that the current state of the files was already up-to-date so I chose to Apply all the changes from the right pane. Argh, hete it get very confusing, because it turns out that this operation does not copy the whole file to the merge result. It appears to do something different, so I ended up having a few unused methods in the result files, that were deleted in my version.&lt;br /&gt;&lt;br /&gt;&lt;i style="font-weight: bold;"&gt;Lesson learned:&lt;/i&gt; Know in detail  the behaviour of the tools you use, unless you like surprises :)  When starting a major refactoring make sure that noone else is editing the code.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Aftermath&lt;/span&gt;: I think the mission was a success. Why?&lt;br /&gt;&lt;ul&gt;&lt;li&gt;I can now work on a codebase that makes me feel comfortable and productive.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I learned a few things along the way that could help do better the next time I have to clean bad looking code. &lt;/li&gt;&lt;li&gt;I had a chance to show my colleagues the power of ReSharper, my standards for good code, and what was the state of our code base (btw, this was one of the best designed and documented parts in the solution). I guess that I should have done that a while ago. In fact I proposed such a course of action few months ago, but I don't think that I pointed clearly what the benefits were. But when people dwell in clean code for some time and see how good code feels, they realize that they don't have to work in the mess, so they are ready to make the necessary effort to do so. &lt;/li&gt;&lt;li&gt;Finally, I was really amazed how productive and energetic I was, when working on something I thought would make a difference.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115960906060045886?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/115960906060045886/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=115960906060045886&amp;isPopup=true" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/115960906060045886" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/115960906060045886" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/5OMIzPhDHVs/refactoring-code-how-do-you-know-you.html" title="Refactoring Code - How Do You Know You Are Not Breaking It" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://immitev.blogspot.com/2006/09/refactoring-code-how-do-you-know-you.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115868197359580020</id><published>2006-09-19T19:06:00.000+03:00</published><updated>2006-09-27T01:19:10.016+03:00</updated><title type="text">Atlas Woes</title><content type="html">&lt;p&gt;Today was my second attempt to employ Atlas in the ASP.NET project at work. The first attempt was before my summer vacation when I tried to modify the Login page to use &lt;a href="http://atlas.asp.net/atlastoolkit/CascadingDropDown/CascadingDropDown.aspx"&gt;CascadingDropDown&lt;/a&gt; which is a part of the Atlas Toolkit. For a day and a half I could not get it to work, but at least I got acquainted with Atlas. I eventually figured out what the problem was and it was not Atlas-related. While filling the drpdown for the login info, I was trying calling a web service that redirected me again to the start of the login process :) No wonder I couldn't get it to work.&lt;/p&gt; &lt;p&gt;Today was my second battle with Atlas - again using the CascadingDropDown, but on a different page. This experiment was meant to be simpler than the previous one but it was actually harder. Unfortunately I was getting the cryptic error "Unknown Error" in IE6. I had no idea what it meant, but after some googling and numerous experiments, it revealed to be Atlas related issue (if the EnablePartialRendering is set to false, the problem does not occur).&lt;/p&gt; &lt;p&gt;After more googling I found &lt;a href="http://weblogs.asp.net/hpreishuber/archive/2006/08/23/ATLAS_3A00_-unknown-error-popup-issue.aspx"&gt;this post&lt;/a&gt; and in the comments I noticed a few good tips how to deal with such a problem. I better copy&amp;paste them (with a little rewording to clarify them):&lt;/p&gt; &lt;p&gt;1) Replace Response.Write() with this.Page.RegisterClientScriptBlock(function)&lt;br /&gt;2) Put complex javascript functions in CDATA sections.&lt;br /&gt;3) Check syntax of html, css, javascript&lt;br /&gt;4) Remove characters that cause invalid XML output&lt;br /&gt;5) Try to build pages sometimes with UpdatePanel or sometimes with web methods in aspx page with the use of atlas.js file &amp;amp; javascript functions to call those web method without page refresh. &lt;/p&gt;&lt;p&gt;I am still not able to find the exact place where the error occurs in the page, but now at least I know where I should focus. UPDATE: After spending another half a day trying to resolve the issue, there was no progress at all. We decided to postpone Atlas adoption in the project (probably until the release of an official version). I actually feel good about such course of action. Now we can spend more time on other areas of the product that will make greater difference than a few eliminated postbacks :)&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115868197359580020?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/115868197359580020/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=115868197359580020&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/115868197359580020" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/115868197359580020" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/8eMEZ9IfBBc/atlas-woes.html" title="Atlas Woes" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2006/09/atlas-woes.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-6471778.post-115858769707311637</id><published>2006-09-18T16:54:00.000+03:00</published><updated>2006-09-18T16:55:05.800+03:00</updated><title type="text">Question: How Do You Know Your Windows Is Getting Overwhelmed?</title><content type="html">&lt;p&gt;Answer: When the Start menu fits in 4 columns (I wonder how 5 columns can be displayed on the screen).&lt;/p&gt; &lt;p&gt;P.S. My relief is that I almost never start programs from the Start menu - Launchy and Slickrun are really helpful.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/6471778-115858769707311637?l=immitev.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://immitev.blogspot.com/feeds/115858769707311637/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=6471778&amp;postID=115858769707311637&amp;isPopup=true" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/115858769707311637" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/6471778/posts/default/115858769707311637" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/immitev/~3/IXea_VvcvFc/question-how-do-you-know-your-windows.html" title="Question: How Do You Know Your Windows Is Getting Overwhelmed?" /><author><name>Ivan Mitev</name><uri>http://www.blogger.com/profile/00282745654787781625</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd="http://schemas.google.com/g/2005" name="OpenSocialUserId" value="12424223055617995951" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://immitev.blogspot.com/2006/09/question-how-do-you-know-your-windows.html</feedburner:origLink></entry></feed>
