<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" version="2.0">
  <channel>
    <title>VB Migration Partner</title>
    <description>blog</description>
    <link>http://www.vbmigration.com/Blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.Net Syndication Generator 1.0.0.0 (http://dotnetblogengine.net/)</generator>
    <language>en-GB</language>
    <blogChannel:blogRoll>http://www.vbmigration.com/Blog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.vbmigration.com/blog/syndication.axd</blogChannel:blink>
    <dc:creator>My name</dc:creator>
    <dc:description>blog</dc:description>
    <dc:title>VB Migration Partner</dc:title>
    <geo:lat>100.000000</geo:lat>
    <geo:long>100.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/VbMigrationPartner" type="application/rss+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item>
      <title>Nearly 500 pages of .NET tutorials available on vbmigration.com</title>
      <description>&lt;table border="0"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td width="200"&gt;
			&lt;img src="/BookChapters/ProgrammingVB2005_Cover.gif" alt="" /&gt;
			&lt;/td&gt;
			&lt;td&gt;
			Today we&amp;#39;ve open a new &lt;a href="http://www.vbmigration.com/Blog/Resources/BookChapters.aspx"&gt;Book Chapters&lt;/a&gt; section, that gathers links to the PDF version of chapters excerpted from the books I wrote or co-authored in these years.It&amp;#39;s a bunch of 11 chapters for a total of nearly 500 printed pages. It&amp;#39;s like having an entire book &lt;strong&gt;&lt;em&gt;for free&lt;/em&gt;&lt;/strong&gt;!
			&lt;p&gt;
			This new material nearly doubles the information already available in our &lt;a href="http://www.vbmigration.com/Blog/Resources/migratingfromvb6.aspx" target="_blank"&gt;Resources &lt;/a&gt;section, with details on the many differences between VB6 and VB.NET.
			&lt;/p&gt;
			&lt;p&gt;
			If you are a VB6 developer wondering what VB.NET has to offer you, you might want to check the chapters on &lt;a href="http://www.vbmigration.com/Blog/BookChapters/ProgrammingVB2005_Chap11.pdf" target="_blank"&gt;Generics&lt;/a&gt;, &lt;a href="http://www.vbmigration.com/Blog/BookChapters/ProgrammingVB2005_Chap18.pdf" target="_blank"&gt;Reflection&lt;/a&gt;, and &lt;a href="http://www.vbmigration.com/Blog/BookChapters/ProgrammingCSharp2005_Chap10.pdf" target="_blank"&gt;Custom Attributes&lt;/a&gt;.  
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=9aBtewN0C4Q:lR_TtjtDXN8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=9aBtewN0C4Q:lR_TtjtDXN8:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/11/Nearly-500-pages-of-NET-tutorials-available-on-vbmigrationcom.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/11/Nearly-500-pages-of-NET-tutorials-available-on-vbmigrationcom.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=c9d03a7d-1a29-42d0-9bb7-cc4b9c63da6d</guid>
      <pubDate>Mon, 09 Nov 2009 22:59:00 -0800</pubDate>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=c9d03a7d-1a29-42d0-9bb7-cc4b9c63da6d</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=c9d03a7d-1a29-42d0-9bb7-cc4b9c63da6d</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/11/Nearly-500-pages-of-NET-tutorials-available-on-vbmigrationcom.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=c9d03a7d-1a29-42d0-9bb7-cc4b9c63da6d</wfw:commentRss>
    </item>
    <item>
      <title>[WHITEPAPER] Support library and code maintainability</title>
      <description>&lt;p&gt;
We have just published a new whitepaper:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.vbmigration.com/Blog/whitepapers/codemaintainability.aspx"&gt;&lt;strong&gt;Support library and code maintainability&lt;/strong&gt;&lt;/a&gt;&lt;br /&gt;
In addition to providing 100% functional equivalence with the original VB6 
code, VB Migration Partner&amp;rsquo;s extensive support library is the key for generating 
code that is readable and easily maintainable. This whitepaper busts a few false 
myths about support libraries by comparing the concise source code that VB 
Migration Partner generates with the code produced by other tools that don&amp;rsquo;t 
rely on an equally extensive library. 
&lt;/p&gt;
&lt;p&gt;
Happy reading!
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=jD8jKFVj7e8:ISDNXr8ozos:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=jD8jKFVj7e8:ISDNXr8ozos:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/11/WHITEPAPER-Support-library-and-code-maintainability.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/11/WHITEPAPER-Support-library-and-code-maintainability.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=2eb1d419-215c-44d2-90c7-f1995a8dd7bc</guid>
      <pubDate>Fri, 06 Nov 2009 04:31:00 -0800</pubDate>
      <category>Resources</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=2eb1d419-215c-44d2-90c7-f1995a8dd7bc</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=2eb1d419-215c-44d2-90c7-f1995a8dd7bc</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/11/WHITEPAPER-Support-library-and-code-maintainability.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=2eb1d419-215c-44d2-90c7-f1995a8dd7bc</wfw:commentRss>
    </item>
    <item>
      <title>"Programming Visual Basic 6" 10-year anniversary edition</title>
      <description>&lt;p&gt;
&lt;table border="0"&gt;
	&lt;tbody&gt;
		&lt;tr&gt;
			&lt;td width="110"&gt;
			&lt;img src="http://www.vbmigration.com/Blog/image.axd?picture=programmarevb6.jpeg" alt="" /&gt;&lt;/td&gt;
			&lt;td&gt;In 1999 Microsoft Press published by first English book, &amp;quot;&lt;a href="http://www.amazon.com/exec/obidos/ASIN/0735605580/o/qid=975575118/sr=2-1/106-5201093-0243640" target="_blank"&gt;Programming Visual Basic 6&lt;/a&gt;&amp;quot;. It was a 1,200 page book that covered virtually every single facet of VB6, the most popular Windows programming language at that time. It was also one of the few books that didn&amp;#39;t treat VB-ers as second-class developers who highest aspiration was to put a bunch of controls on a form and write some code in a button&amp;#39;s Click event.
			&lt;p&gt;
			The book has had an incredible success, far higher than even Microsoft Press expected, and quickly became the &amp;quot;VB6 Bible&amp;quot; for many developers all around the world. It was translated to 5 or 6 different languages. In Italy alone it sold over 60,000 copies (counting the standard and the pocket edition) and after all these years no other programming book has topped that number here in Italy. According to my calculations, it sold between 200,000 and 250,000 copies all over the world. 
			&lt;/p&gt;
			&lt;p&gt;
			Frankly I don&amp;#39;t know whether &lt;em&gt;Programming Visual Basic 6 &lt;/em&gt;has been the most successful VB6 book every published, but I am rather sure that it has been the one which has sold for longer. In fact, I still receive royalties from this book, which is truly unbeliavable given that Microsoft discontinued VB6 seven years ago.
			&lt;/p&gt;
			&lt;p&gt;
			To face the demand from readers and to celebrate the success of the book, my Italian publisher Mondadori just published &amp;quot;Programmare Visual Basic 6 - 10-year Anniversary Edition&amp;quot;. It is a pocket book with a beautiful, golden hard cover. At least here in Italy only another computer book was successful enough to deserve a 10-year special edition.&amp;nbsp;
			&lt;/p&gt;
			&lt;p&gt;
			Wow! &lt;img src="/Blog/admin/tiny_mce/plugins/emotions/images/smiley-cool.gif" border="0" alt="Cool" title="Cool" /&gt;
			&lt;/p&gt;
			&lt;/td&gt;
		&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=OyZglGroKas:jFvIY-_5rWM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=OyZglGroKas:jFvIY-_5rWM:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/11/Programming-Visual-Basic-6-10-year-anniversary-edition.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/11/Programming-Visual-Basic-6-10-year-anniversary-edition.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=667c3285-4207-46be-98d3-9b1274bd32b4</guid>
      <pubDate>Thu, 05 Nov 2009 00:24:00 -0800</pubDate>
      <category>Resources</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=667c3285-4207-46be-98d3-9b1274bd32b4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=667c3285-4207-46be-98d3-9b1274bd32b4</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/11/Programming-Visual-Basic-6-10-year-anniversary-edition.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=667c3285-4207-46be-98d3-9b1274bd32b4</wfw:commentRss>
    </item>
    <item>
      <title>My speech at Microsoft Western Europe Partners Summit</title>
      <description>&lt;p&gt;
Yesterday I spoke at Microsoft Western Europe Inner Circle Partners Summit with a session of - you guessed it right! - Code Architects&amp;#39; VB Migration Partner. The conference was held in Rome and we could watch many interesting sessions from Microsoft people and other MS partners. 
&lt;/p&gt;
&lt;p&gt;
It was a short but dense, not very technical, presentation that focused on business opportunities for Microsoft Partners who will to operate in this narrow but growing market niche. 
&lt;/p&gt;
&lt;p&gt;
We got in touch with many companies located in Spain, Belgium, Netherlands, Ireland, and other countries. We hope to establish a partnership with these companies very soon, which means that all our European nations will have the opportunity to work with a qualified partner for all their migration needs.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=BlxlPa7icws:Zn9OJx2TPOw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=BlxlPa7icws:Zn9OJx2TPOw:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/11/My-speech-at-Microsoft-Wester-Europe-Partners-Summit.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/11/My-speech-at-Microsoft-Wester-Europe-Partners-Summit.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=9d4c8868-228f-4131-940d-f016925af6f2</guid>
      <pubDate>Tue, 03 Nov 2009 23:16:00 -0800</pubDate>
      <category>Events</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=9d4c8868-228f-4131-940d-f016925af6f2</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=9d4c8868-228f-4131-940d-f016925af6f2</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/11/My-speech-at-Microsoft-Wester-Europe-Partners-Summit.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=9d4c8868-228f-4131-940d-f016925af6f2</wfw:commentRss>
    </item>
    <item>
      <title>11 false myths about support libraries</title>
      <description>&lt;p&gt;
Some developers may be concerned about support library and would prefer not to distribute an additional DLL with their migrated apps. This is quite understandable, but we believe that these concerns are negligible if compared to the many advantages that a well-written, comprehensive library gives you.
&lt;/p&gt;
&lt;p&gt;
Such benefits stand out so clearly that even our competitors don&amp;rsquo;t deny that an extensive library can speed up a migration project. To counter this evidence, however, they insinuate that a library has many shortcomings, too. Fortunately, we can easily prove that all these &amp;ldquo;issues&amp;rdquo; are groundless, as we do in our &lt;a href="http://www.vbmigration.com/Blog/whitepapers/support_library.aspx" target="_blank"&gt;17 reasons for using a support library in migration scenarios &lt;/a&gt;whitepaper. 
&lt;/p&gt;
&lt;p&gt;
The point is, a comprehensive support library is the key factor in achieving 100% functional equivalence and in keeping migration time and cost as low as possible. Just read what &lt;a href="http://www.vbmigration.com/Blog/usersfeedback.aspx" target="_blank"&gt;one of our customers &lt;/a&gt;has to say: 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&amp;ldquo;An initial migration compared migration tools from six vendors. It showed superior results for VB Migration Partner, which delivered fewer compilation and runtime errors than all its competitors&amp;hellip; &lt;strong&gt;It took 2.5 hours to get a compilable and runnable VB.NET project with VB Migration Partner, and 13 hours with its closest competitor.&amp;rdquo;&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
The higher productivity that a complete support library gives you is a sure fact, and our competitors haven&amp;rsquo;t found yet a way to obtain different results in similar rigorous productivity tests. In the absence of objective measurements, they attempt to scare potential customers away from VB Migration Partner by making vague statements about its supposed shortcomings. 
&lt;/p&gt;
&lt;p&gt;
These statements never mention VB Migration Partner or Code Architects, yet the target is undoubtedly our product because we are the only VB6 conversion software vendors who use an extensive support library:
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;1)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;other vendors charge a runtime fee for their support library.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;VB Migration Partner users can freely distribute its library with their apps. &lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;2)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;other vendors don&amp;rsquo;t make their library&amp;rsquo;s source code available to customers.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;VB Migration Partner users can license the library&amp;rsquo;s code.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;3)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip; apps that rely on a support library might not work on future versions of the operating system.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;VB
Migration Partner&amp;rsquo;s library is written in pure VB.NET and uses only
documented features of the .NET Framework. As such, the library is
guaranteed to work on all future Windows versions that support .NET
Framework 3.5 binaries. &lt;br /&gt;
&lt;br /&gt;
A closer examination reveals that this
line of reasoning is illogical. Just for the sake of discussion, let&amp;rsquo;s
assume that Microsoft releases a Windows or .NET Framework version
breaks compatibility with existing .NET 3.5 programs. In such a highly
unlikely case, your own VB.NET applications will stop working correctly
and the support library will be the least of your problems.&lt;br /&gt;
&lt;br /&gt;
A
support library actually&lt;em&gt;&lt;strong&gt; helps to preserve compatibility&lt;/strong&gt;&lt;/em&gt;. Should a
future version of Windows have minor problems in running .NET 3.5 code,
Code Architects will promptly fix the problem and release a new support
library that all users can download for free. You&amp;rsquo;ll still have to
solve compatibility problems of your main app, but at least you don&amp;rsquo;t
have to worry about the support library.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;4)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;other vendors may charge a subscription fee for using the library in the future.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;VB Migration Partner&amp;rsquo;s EULA states that users will be allowed to download any future 1.xx version of the library at no additional cost. Future 1.xx releases include fixes for all the problems that might be discovered in the future by Code Architects or its customers.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;5)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip; if your migrated apps depend on a 3rd-party library, you might be in trouble if the vendor decides to stop supporting it in the future&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;VB Migration Partner&amp;rsquo;s EULA states that &amp;ndash; should Code Architects stop supporting the product &amp;ndash; all customers will receive the library&amp;rsquo;s source code at no additional cost. In this respect, choosing Code Architects is as safe as, or safer than, choosing any 3rd-party control, such as the grid or the report component that you might be using in most of your forms.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;6)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip; a support library can slow down your code&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;VB Migration Partner&amp;rsquo;s library is carefully optimized and often runs much
faster than the code that most VB.NET or C# developers usually write,
especially if they are put under pressure by near deadlines. For
example, our VB6Collection class runs many times faster than the
standard VB.NET Collection object, and our StringBuilder object allows
you to automatically speed up string concatenations by a factor of 100x
without having you modify the generated VB.NET code.
&lt;/p&gt;
&lt;p&gt;
Keep in mind that VB Migration Partner&amp;rsquo;s library has been authored by a team of expert developers, including two Microsoft Regional Directors who have written &lt;a href="http://www.amazon.com/Francesco-Balena/e/B001IGLNII" target="_blank"&gt;7 top-selling Microsoft Press books&lt;/a&gt; on VB and .NET programming, routinely give lectures in US and Europe, and consult for Microsoft and its largest customers. &lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;7)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;other migration tools generate inefficient code that retains its VB6 flavor&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;VB Migration Partner&amp;rsquo;s conversion engine uses very sophisticated refactoring techniques and generates code that takes full advantage of VB.NET features, including Try/Catch blocks, short-circuiting (the AndAlso operator), the IDisposable interface, variable initializes, compound operators (e.g. x += 1), and much more.&lt;br /&gt;
&lt;br /&gt;
Interestingly, VB Migration Partner can apply many refactoring techniques that no other VB6 conversion tool currently supports, e.g. Gosub refactoring, Declare overloads, faster string concatenations inside loops, enforcement of ByVal keyword if possible. Our competitors should think twice before drawing developers&amp;rsquo; attention to this point.&lt;br /&gt;
&lt;br /&gt;
Finally, consider that VB Migration Partner&amp;rsquo;s developers wrote &lt;a href="http://www.amazon.com/Practical-Guidelines-Microsoft%C2%AE-Developers-Pro-Developer/dp/0735621721/ref=ntt_at_ep_dpi_3" target="_blank"&gt;Practical Guidelines and Best Practices for VB and C# Developers&lt;/a&gt; (Microsoft Press), perhaps the definitive textbook on this topic, and VB Migration Partner&amp;rsquo;s generates code that abides to all those rules. Additionally, VB Migration Partner is able to &lt;em&gt;&lt;strong&gt;rename members to comply with .NET coding guidelines&lt;/strong&gt;&lt;/em&gt;. If you don&amp;rsquo;t like standard .NET rules you can easily customize the rename engine by modifying an XML file. No other conversion software supports customizable rename rules.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;8)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;the code produced by other VB6 converters that adopt a support library is hard to maintain&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;A support library can make your migrated code more readable and easier to maintain, as I demonstrated in a &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2009/10/How-support-library-affect-long-term-code-maintainability.aspx" target="_blank"&gt;previous post&lt;/a&gt;. 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;9)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;projects produced by other VB6 converters are difficult to evolve&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;VB Migration Partner library doesn&amp;rsquo;t limit you in any way, because all its classes inherit from native .NET classes and you can therefore leverage the .NET Framework full potential. (Our competitors seem to be oblivious of the power of .NET inheritance...)&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;10)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;you can&amp;rsquo;t mix .NET native forms and controls with forms and controls defined in a support library&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;After you&amp;rsquo;ve converted a VB6 project to VB.NET using VB Migration Partner, you can extend the application by adding .NET native forms, and you can drop .NET native controls onto a migrated form. The one thing you can&amp;rsquo;t do is using a control defined in our support library in a standard .NET form, an action that would be meaningless anyway.&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;11)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;hellip;you can&amp;rsquo;t use Visual Studio 2008 Test Wizard to generate unit tests for VB.NET projects that use a support library.&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;FALSE! &lt;/strong&gt;&lt;/font&gt;We describe this apparent problem &amp;ndash; and its solution - in this &lt;a href="http://www.vbmigration.com/Blog/detknowledgebase.aspx?Id=367" target="_blank"&gt;KB article&lt;/a&gt;. It seems that our competitors can&amp;rsquo;t read carefully what we publish on our web site, or more probably they prefer to ignore what contrasts with their wishes.
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=BBTuzy84LFM:qZPS2SWMhDE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=BBTuzy84LFM:qZPS2SWMhDE:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/11-false-myths-about-support-libraries.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/11-false-myths-about-support-libraries.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=fde11159-9be6-46bd-875f-b8040dc156af</guid>
      <pubDate>Fri, 30 Oct 2009 23:07:00 -0800</pubDate>
      <category>VB Migration Partner</category>
      <category>Competing products</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=fde11159-9be6-46bd-875f-b8040dc156af</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=fde11159-9be6-46bd-875f-b8040dc156af</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/11-false-myths-about-support-libraries.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=fde11159-9be6-46bd-875f-b8040dc156af</wfw:commentRss>
    </item>
    <item>
      <title>Migration pragmas vs. project-wide customization settings</title>
      <description>&lt;p&gt;
VB Migration Partner&amp;#39;s pragmas offer a powerful and granular approach to code customization. With &lt;strong&gt;70+ pragmas available&lt;/strong&gt;, you can control virtually any single aspect of code conversion. For example you can use pragmas to:
&lt;/p&gt;
&lt;p&gt;
&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp; correctly convert Null and Variant values &lt;br /&gt;
&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp; solve problems caused by arrays with nonzero lower bound, As New (auto-instancing) variables, IDisposable variables, etc.&lt;br /&gt;
&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp; optimize code that would be inefficient when converted as-is to .NET (e.g. string concatenation)&lt;br /&gt;
&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp; prevent subtle runtime exceptions caused by imperfect functional equivalence between VB6 and VB.NET&lt;br /&gt;
&amp;bull;&amp;nbsp;&amp;nbsp;&amp;nbsp; remove or comment unused or unreachable code, use Try-Catch blocks where possible, refactor Gosub keywords into calls to separate methods, and so forth&lt;br /&gt;
&amp;bull;&amp;nbsp;&amp;nbsp; ... and much more.
&lt;/p&gt;
&lt;p&gt;
Each pragma is described in depth in our &lt;a href="http://www.vbmigration.com/Blog/Documentation/chapter5.aspx"&gt;online documentation&lt;/a&gt;, therefore I won&amp;#39;t explain what each pragma does. Suffice it to say that all these pragmas allow you be in control of VB Migration Partner&amp;#39;s code generation engine, so that you can always generate the most efficient and robust VB.NET code that is functional equivalent to the original VB6 project. 
&lt;/p&gt;
&lt;p&gt;
The purpose of this article is to compare migration pragmas with the customization mechanisms offered by other VB6 conversion tools. 
&lt;/p&gt;
&lt;p&gt;
In a nutshell, a migration pragma is a remark that you insert in the original VB6 code base or in a separate file named &amp;lt;projectname&amp;gt;.pragmas. Pragma files are very handy for copying groups of pragmas to another migration project, on the same or different computer. Pragma files even support #Include directives, therefore different projects can actually share a centralized pragma file. If you later want to add or remove a pragma from the centralized file you don&amp;#39;t have to manually edit individual files.
&lt;/p&gt;
&lt;p&gt;
The great thing about pragmas is that they can affect the entire solution/project, a single file, or an individual method or variable. This sophisticated scoping mechanism allows you to define a general conversion rule at the project-level and then mention one or more exceptions at the file-, method-, or variable-level.
&lt;/p&gt;
&lt;p&gt;
VB Migration Partner is the only conversion software that supports pragmas. &lt;font color="#3366ff"&gt;&lt;strong&gt;All other conversion tools offer personalization rules that can only work at the project level. &lt;/strong&gt;&lt;/font&gt;Each rule is an all-or-nothing decision, and you can&amp;#39;t apply a rule only to a portion of the project. As you&amp;#39;ll see shortly, such lack of granularity can be a problem in real-world scenarios.
&lt;/p&gt;
&lt;p&gt;
Let&amp;rsquo;s see a concrete example that shows how the two approaches compare to each other. 
&lt;/p&gt;
&lt;p&gt;
VB6 language supports Variant variables, which can contain both a scalar value - e.g. a number or a string - or a reference to an object. When migrating to VB.NET such Variant variables, all migration tools convert those Variant variables as Object variables. For example, consider the followingVB6 code:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp; Sub ShowDefaultMemberValue(ByVal var As Variant)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim s As String&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; s = var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(s)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End Sub&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
This method works well both when &lt;em&gt;var &lt;/em&gt;contains a scalar value and when it contains a reference to an object, for example a TextBox control. In the latter case, the method displays the &lt;strong&gt;&lt;em&gt;default member &lt;/em&gt;&lt;/strong&gt;for the object (e.g. the Text property if &lt;em&gt;var &lt;/em&gt;points to a TextBox control, or the Value property if var points to an ADODB.Field object.)
&lt;/p&gt;
&lt;p&gt;
By default, VB Migration Partner and other conversion tools convert the above method to VB.NET as follows:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp; Sub ShowDefaultMemberValue(ByVal var As Object)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim s As String = var&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(s)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End Sub&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
This code works well if &lt;em&gt;var &lt;/em&gt;contains a scalar value, but throws an InvalidCast exception if &lt;em&gt;var &lt;/em&gt;points to an object. The reason is that the VB.NET is unable to extract the default member of an object, unlike VB6.
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;&lt;strong&gt;NOTE: &lt;/strong&gt;VB Migration Partner and possibly other products can, in some cases, use type inference to convert these Variants into definite types such as Integer or String. Besides, VB Migration Partner is also able to use the special VB6Variant variables, for improved functional equivalence. We won&amp;#39;t take these cases into account, because aren&amp;#39;t important for our general discussion on pragmas.)&lt;/em&gt; 
&lt;/p&gt;
&lt;p&gt;
Let&amp;#39;s now see how each different conversion tools can fix this problem. 
&lt;/p&gt;
&lt;p&gt;
VB Migration Partner supports the &lt;a href="http://www.vbmigration.com/Blog/Documentation/chapter5.aspx#DefaultMemberSupport" target="_blank"&gt;DefaultMemberSupport &lt;/a&gt;pragma, which tells the code generation engine that references to Variant and Object variables should be wrapped in a helper method that determines the object&amp;rsquo;s default member and returns its value to callers:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp; Sub ShowDefaultMemberValue(ByVal var As Object)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim s As String = GetDefaultMember6(var)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MsgBox(s)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End Sub&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
The &lt;strong&gt;GetDefaultMember6 &lt;/strong&gt;method (defined in VB Migration Partner&amp;#39;s support library) returns the value of the Text property for a TextBox control, the value of the Checked property for a CheckBox or OptionButton control, and so on. A similar helper method named &lt;strong&gt;SetDefaultMember6 &lt;/strong&gt;is used to assign the default member of a given object that is accessed in late-bound mode.
&lt;/p&gt;
&lt;p&gt;
The GetDefaultMember6 and SetDefaultMember6 methods clearly improve functional equivalence with the original VB6 code at the expense of reduced code readability and maintainability. In addition, these two methods can slightly affect runtime performance. 
&lt;/p&gt;
&lt;p&gt;
For these reasons, we recommend that you use the DefaultMemberSupport pragma only where one or more variables are known to contain a reference to a control or object. Conversely, if an Object variable is the result of the conversion of a VB6 Variant that can contain a scalar value, you should avoid the overhead &amp;ndash; in both readability and performance &amp;ndash; introduced by these methods.&lt;br /&gt;
&lt;br /&gt;
Avoiding such an overhead is easy with VB Migration Partner, because its pragmas can be granularly scoped at the file or method level, and even at the single variable level. In previous example, you can leverage this granularity and associate the DefaultMemberSupport pragma only with the &lt;em&gt;obj &lt;/em&gt;variable:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier" color="#339966"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;## obj.DefaultMemberSupport True&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
When such a pragma is used, only references to the &lt;em&gt;obj &lt;/em&gt;variable are wrapped in GetDefaultMember6 or SetDefaultMember6 methods. (One pragma affects all occurrences o a given variable, or all variables defined in a given method or file.) All other Object variables are unaffected by this specific pragmas.
&lt;/p&gt;
&lt;p&gt;
Conversely, because of their project-wide conversion rules, when using a converter other VB Migration Partner you&amp;#39;re forced to pollute your entire code base with one helper method call for each occurrence of an Object variable, even if that variable can only contain a scalar value.&lt;font color="#3366ff"&gt;&lt;strong&gt; Such a massive presence of helper method calls can have a serious impact on overall performance, readability, and ease of maintance&lt;/strong&gt;.&amp;nbsp; 
&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Not surprisingly, given these drawbacks, users of products other than VB Migration Partner often avoid enabling this and other project-level options, for example support for IsMissing keywod, conversion from On Error to Try/Catch, and improved support for late-bound calls. 
&lt;/p&gt;
&lt;p&gt;
This is a well-known problem that only VB Migration Partner&amp;#39;s pragmas can solve in a simple and effective way. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=rjBOsFDx4Yw:_0GZTesF0Is:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=rjBOsFDx4Yw:_0GZTesF0Is:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/Migration-pragmas-vs-migration-profiles.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/Migration-pragmas-vs-migration-profiles.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=bd7cf0c3-4e5e-49e1-ba2b-6fc16c96581b</guid>
      <pubDate>Tue, 27 Oct 2009 23:38:00 -0800</pubDate>
      <category>Competing products</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=bd7cf0c3-4e5e-49e1-ba2b-6fc16c96581b</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=bd7cf0c3-4e5e-49e1-ba2b-6fc16c96581b</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/Migration-pragmas-vs-migration-profiles.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=bd7cf0c3-4e5e-49e1-ba2b-6fc16c96581b</wfw:commentRss>
    </item>
    <item>
      <title>[NEW VERSION] VB Migration Partner 1.21 has been released</title>
      <description>&lt;p&gt;
We have just made VB Migratio Partner 1.21 available to all registered users.
&lt;/p&gt;
&lt;p&gt;
The new version fixes a few minor bugs and adds some interesting features:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;the TabEnable and TabVisible properties of the SSTab control&lt;/li&gt;
	&lt;li&gt;hotkeys in SSTab captions, and the ability to change the alignment of SSTab captions by means of the new &lt;strong&gt;TabCaptionAlignment &lt;/strong&gt;property, so that you can perfectly emulate VB6 appearance if you wish&lt;/li&gt;
	&lt;li&gt;the new &lt;strong&gt;Collection6 &lt;/strong&gt;class can optionally replace a plain Collection object if you want to &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2009/10/A-subtle-collection-behavior.aspx" target="_blank"&gt;preserve the VB6 semantics&lt;/a&gt; when adding arrays to a VB.NET collection&lt;/li&gt;
	&lt;li&gt;the code generator generates the correct code for Erase keywords that work on &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2009/10/Static-and-dynamic-arrays-ARE-different%2c-after-all.aspx" target="_blank"&gt;static arrays&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
In addition to these technical detais, we wanted to improve the user experience and reduce the need for our customers to contact our tech support. The first time you convert a VB6 project, VB Migration Partner 1.21 displays a message box that invites to generate a report for all the migration warnings and issues in the converted VB.NET project. This simple trick will help first-time users to correctly decode all migration messages and apply the right pragma to fix all most common issues.
&lt;p&gt;
As usual, registered customers will be alerted that there is a new version available the next time they run VB Migration Partner (provided that they have a working Internet connection, of course).
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=Yi1ScmxQsyc:IB0OtdHu6lM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=Yi1ScmxQsyc:IB0OtdHu6lM:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/NEW-VERSION-VB-Migration-Partner-121-has-been-released.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/NEW-VERSION-VB-Migration-Partner-121-has-been-released.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=12cc7f41-3209-45a3-9cdf-0ddf5686da8d</guid>
      <pubDate>Fri, 23 Oct 2009 03:03:00 -0800</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=12cc7f41-3209-45a3-9cdf-0ddf5686da8d</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=12cc7f41-3209-45a3-9cdf-0ddf5686da8d</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/NEW-VERSION-VB-Migration-Partner-121-has-been-released.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=12cc7f41-3209-45a3-9cdf-0ddf5686da8d</wfw:commentRss>
    </item>
    <item>
      <title>Static and dynamic arrays ARE different, after all</title>
      <description>In VB6 you have two different kinds of arrays, static and dynamic. A VB6 static array is defined by means of a DIM keyword that specifies lower and upper indexes, whereas a dynamic array is defined by means of a DIM keyword with empty parenthesis
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp; &amp;nbsp; Dim arr1(10) As Integer &amp;nbsp; &amp;nbsp; &amp;#39; a static array&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim arr2() As Integer&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; a dynamic array&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
The key difference between static and dynamic arrays is that you can&amp;#39;t change the size of a static array. VB.NET supports both syntax forms, but in all cases it creates dynamic arrays.
&lt;/p&gt;
&lt;p&gt;
However, there is another, less obvious difference between static and dynamic arrays under VB6, which becomes apparent when you apply the Erase keyword to the array. When you erase a static array all the array elements are reset to zero, empty string, or nothing; when you erase a dynamic array all items are destroyed and you can&amp;#39;t access any element until you REDIM-ension the array.
&lt;/p&gt;
&lt;p&gt;
Previous versions of VB Migration Partner didn&amp;#39;t account for this minor detail, which is also ignored by all other VB6 conversion tools on the market. In upcoming 1.21 version, VB Migration Partner generates a slightly different code when the original VB6 array was static:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp; &amp;nbsp; ClearArray6(arr1) &amp;nbsp; &amp;#39; a static array&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Erase6(arr2) &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;#39; a dynamic array&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
Unfortunately, it isn&amp;#39;t possible to fill the gap between VB6 and VB.NET in all cases. In fact, if the array is one of the parameters of the current method, VB Migration Partner has no way to determine whether the client is passing a static or a dynamic array, because the same method can be passed arrays of both types. For this reason, it assumes that the array is dynamic and uses the Erase6 method, but it additionally generates a warning to alert the developer of the potential problem.&amp;nbsp;
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=hBPkcp9gnl8:1go6VgWkArA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=hBPkcp9gnl8:1go6VgWkArA:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/Static-and-dynamic-arrays-ARE-different,-after-all.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/Static-and-dynamic-arrays-ARE-different,-after-all.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=e23d89e1-ffc5-4668-adaf-abd2ec05198c</guid>
      <pubDate>Fri, 23 Oct 2009 02:43:00 -0800</pubDate>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=e23d89e1-ffc5-4668-adaf-abd2ec05198c</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=e23d89e1-ffc5-4668-adaf-abd2ec05198c</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/Static-and-dynamic-arrays-ARE-different,-after-all.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=e23d89e1-ffc5-4668-adaf-abd2ec05198c</wfw:commentRss>
    </item>
    <item>
      <title>How support library REALLY affects long term code maintainability</title>
      <description>&lt;p&gt;
VB6 and VB.NET are similar languages that differ for a myriad of major and minor details. Even keywords, methods, and controls that have the same name in both environments may have a completely different behavior, as we exhaustively show in our &lt;a href="http://www.vbmigration.com/Blog/Resources/migratingfromvb6.aspx" target="_blank"&gt;Resource&lt;/a&gt; section. 
&lt;/p&gt;
&lt;p&gt;
A tool that aims at preserving functional equivalence with the original VB6 code should account for all or at least the majority of these differences. All the VB6 conversion products on the market, including VB Migration Partner, fill this gap with a combination of these two elements: 
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;code transformation techniques, to generate VB.NET code that behaves like the original VB6 code&lt;br /&gt;
	&lt;/li&gt;
	&lt;li&gt;support library that expose methods and controls that aren&amp;#39;t found in the .NET Framework or in the Microsoft.VisualBasic namespace &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Even the Upgrade Wizard included in Visual Studio, arguably the least sophisticated conversion tool around, relies on TWO support libraries - Microsoft.VisualBasic.Compatibility.dll and Microsoft.VisualBasic.Compatibility.Data.dll - to support VB6 features that have no direct correspondence in VB.NET, such as control arrays and the ADODC, DriveListBox, DirListBox, and FileListBox controls. 
&lt;/p&gt;
&lt;p&gt;
One of VB Migration Partner&amp;#39;s strengths is its comprehensive support library. Its dozens of classes and hundreds of methods ensure that the generated VB.NET code always performs like the original VB6 app, an important factor in dramatically reducing the time and cost of the migration process. No other conversion tool comes with such a complete library and in fact no other conversion tool can compare to VB Migration Partner in its support for VB6 features.
&lt;/p&gt;
&lt;p&gt;
Our competitors are aware of the many advantages of this approach, therefore some of them are adopting a twofold strategy: on one hand they are expanding *their* support library, on the other they publish strongly biased whitepapers where they claim that that extensive libraries compromise the maintainability of the generated VB.NET project. 
&lt;/p&gt;
&lt;p&gt;
Notice that VB Migration Partner is never explicitly mentioned in these documents, therefore authors don&amp;#39;t feel compelled to back up their claims with any sort of evidence. 
&lt;/p&gt;
&lt;p&gt;
In this article I&amp;#39;ll focus only on the supposed lack of readability and maintainability of converted VB.NET that use a support library. But unlike our competitors, I&amp;#39;ll build my assertions on actual code snippets and compare the code that VB Migration Partner generates with the result from a &amp;ldquo;traditional&amp;rdquo; VB6 conversion tool that comes with a less powerful support library. Consider the following KeyPress handler written in VB6: 
&lt;/p&gt;
&lt;p style="font-family: 'Courier New'"&gt;
Private Sub Text1_KeyPress(KeyAscii As Integer)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;&amp;#39; convert the pressed key to uppercase, but ignore spaces&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If KeyAscii = 32 Then KeyAscii = 0 : Exit Sub&lt;br /&gt;
&amp;nbsp;&amp;nbsp; KeyAscii = Asc(Chr(KeyAscii))&lt;br /&gt;
End Sub 
&lt;/p&gt;
&lt;p&gt;
VB Migration Partner converts it as follows: 
&lt;/p&gt;
&lt;p style="font-family: 'Courier New'"&gt;
Private Sub Text1_KeyPress(ByRef KeyAscii As Short) Handles Text1.KeyPress&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;&amp;#39; convert the pressed key to uppercase, but ignore spaces&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If KeyAscii = 32 Then KeyAscii = 0 : Exit Sub&lt;br /&gt;
&amp;nbsp;&amp;nbsp; KeyAscii = Asc(Chr(KeyAscii))&lt;br /&gt;
End Sub 
&lt;/p&gt;
&lt;p&gt;
The resulting VB.NET code is basically identical to the original code, and many VB6 developers understand how to read and maintain this code. Obviously there is no maintainability problem here.&lt;br /&gt;
&lt;br /&gt;
Let&amp;rsquo;s see now the code produced by another conversion tool that doesn&amp;#39;t rely on an extensive support library. The name the tool in question isn&amp;#39;t really important, because the same concepts apply to any conversion tool that attempts to fill the gap between VB6 and VB.NET exclusively by means of code transformation techniques: 
&lt;/p&gt;
&lt;p style="font-family: 'Courier New'"&gt;
Private Sub Text1_KeyPress(ByVal eventSender As Object, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ByVal eventArgs As KeyPressEventArgs) Handles Text1.KeyPress&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim KeyAscii As Integer = Strings.Asc(eventArgs.KeyChar)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &lt;span style="color: green"&gt;&amp;#39; convert the pressed key to uppercase, but ignore spaces&lt;/span&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If KeyAscii = 32 Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; KeyAscii = 0&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If KeyAscii = 0 Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eventArgs.Handled = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Exit Sub&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End If &lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; KeyAscii = Strings.Asc(Strings.Chr(KeyAscii).ToString()(0))&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If KeyAscii = 0 Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; eventArgs.Handled = True&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp; eventArgs.KeyChar = Convert.ToChar(KeyAscii)&lt;br /&gt;
End Sub 
&lt;/p&gt;
&lt;p&gt;
In the attempt to preserve functional equivalence of the original 3 statements inside the method, the tool generated as many as 13 (thirteen!!) statements.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
You might believe that the KeyPress event is a special and unique case, so let&amp;rsquo;s see another code snippet, a simple VB6 method that defines two optional parameters: 
&lt;/p&gt;
&lt;p style="font-family: 'Courier New'"&gt;
Public Sub TestOptional(Optional x As Variant, Optional y As Variant)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If IsMissing(x) Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If IsMissing(y) Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 20&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp; MsgBox x * y&lt;br /&gt;
End Sub 
&lt;/p&gt;
&lt;p&gt;
This is how VB Migration Partner correctly translates it to VB.NET: 
&lt;/p&gt;
&lt;p style="font-family: 'Courier New'"&gt;
Public Sub TestOptional(ByRef Optional x As Object = MissingValue6, _&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; ByRef Optional y As Object = MissingValue6)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If IsMissing6(x) AndAlso IsMissing6(y) Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 20&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp; MsgBox6(x * y)&lt;br /&gt;
End Sub 
&lt;/p&gt;
&lt;p&gt;
Thanks to its support library, VB Migration Partner can generate code that is as readable and maintainable as the original VB6 method. Well, the generated code is actually &lt;strong&gt;&lt;em&gt;more readable&lt;/em&gt;&lt;/strong&gt;, because our software merged the two nested IFs, however this improvement is achieved by means of its sophisticated conversion engine and isn&amp;#39;t a consequence of using a library. 
&lt;/p&gt;
&lt;p&gt;
Let&amp;rsquo;s now look at the code that our competitor&amp;#39;s tool generates for the same method (for brevity&amp;#39;s sake I removed 4 upgrade warnings): 
&lt;/p&gt;
&lt;p style="font-family: 'Courier New'"&gt;
Public Sub TestOptional(ByRef x_optional As Object, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ByRef y_optional As Object)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim y As Object = Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If y_optional Is Nothing Or Not y_optional.Equals(Type.Missing) Then _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = TryCast(y_optional, Object)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim x As Object = Nothing&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If x_optional Is Nothing Or Not x_optional.Equals(Type.Missing) Then _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = TryCast(x_optional, Object)&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Try&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not (x_optional Is Nothing) AndAlso _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;x_optional.Equals(Type.Missing) Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If Not (y_optional Is Nothing) AndAlso y_optional.Equals(Type.Missing) Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; x = 10&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; y = 20&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; MessageBox.Show(CStr(CDbl(x) * CDbl(y)), Application.ProductName)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Finally&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; y_optional = y&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp; x_optional = x&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End Try&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
Public Sub TestOptional(ByRef x_optional As Object)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim tempRefParam As Object = Type.Missing&lt;br /&gt;
&amp;nbsp;&amp;nbsp; TestOptional(x_optional, tempRefParam)&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
Public Sub TestOptional()&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim tempRefParam2 As Object = Type.Missing&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim tempRefParam3 As Object = Type.Missing&lt;br /&gt;
&amp;nbsp;&amp;nbsp; TestOptional(tempRefParam2, tempRefParam3)&lt;br /&gt;
End Sub 
&lt;/p&gt;
&lt;p&gt;
Now ask yourself: &lt;strong&gt;&lt;em&gt;&lt;span style="color: #3366ff"&gt;Which code would you like to maintain in the future?&lt;/span&gt;&lt;/em&gt;&lt;/strong&gt;&amp;nbsp;The concise adn readable 7-line method produced by VB Migration Partner or the 3 methods and 28 statements produced by the other tool?&lt;br /&gt;
&lt;br /&gt;
Bottom line: never ever trust marketing literature that don&amp;#39;t provide real-world examples and accurate comparisons. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=_NcHybYvoq8:d59iqPb6QwQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=_NcHybYvoq8:d59iqPb6QwQ:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/How-support-library-REALLY-affect-long-term-code-maintainability.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/How-support-library-REALLY-affect-long-term-code-maintainability.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=4ed798bd-b73b-466b-a62c-fba8830ecdce</guid>
      <pubDate>Thu, 22 Oct 2009 22:05:00 -0800</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=4ed798bd-b73b-466b-a62c-fba8830ecdce</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=4ed798bd-b73b-466b-a62c-fba8830ecdce</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/How-support-library-REALLY-affect-long-term-code-maintainability.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=4ed798bd-b73b-466b-a62c-fba8830ecdce</wfw:commentRss>
    </item>
    <item>
      <title>A subtle collection behavior</title>
      <description>&lt;p&gt;
Consider the following, apparently innocent piece of VB code:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&lt;font color="#339966"&gt;&amp;#39; create and initialize an array&lt;/font&gt;&lt;br /&gt;
Dim arr(10) As Integer&lt;br /&gt;
arr(0) = 100&lt;br /&gt;
&lt;font color="#339966"&gt;&amp;#39; store it into a collection&lt;/font&gt;&lt;br /&gt;
Dim col As New Collection&lt;br /&gt;
col.Add(arr)&lt;br /&gt;
&lt;font color="#339966"&gt;&amp;#39; modify the array, compare with the array in the collection&lt;/font&gt;&lt;br /&gt;
arr(0) = 200&lt;br /&gt;
If arr(0) = col(1)(0) Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
txtResult.Text = &amp;quot;Equal&amp;quot;&lt;br /&gt;
Else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;
txtResult.Text = &amp;quot;Not equal&amp;quot;&lt;br /&gt;
End If&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
The question: &lt;strong&gt;&lt;em&gt;what will be displayed in the txtResult control: &amp;quot;Equal&amp;quot; or &amp;quot;Not Equal?&lt;/em&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Surprisingly, the correct answer is &lt;strong&gt;&amp;quot;&lt;em&gt;It depends on the VB6 version!&lt;/em&gt;&amp;quot; &lt;/strong&gt;More precisely, it displays &amp;quot;Not Equal&amp;quot; under VB6 and &amp;quot;Equal&amp;quot; under VB.NET.
&lt;/p&gt;
&lt;p&gt;
In fact, when passing the array to the Collection.Add method, VB6 performs a &lt;em&gt;&lt;strong&gt;copy&lt;/strong&gt;&lt;/em&gt; of the array, therefore the subsequent assignment to arr(0) doesn&amp;#39;t affect the copy already stored in the collection and the two arr(0) elements are now different. Vice versa, VB.NET passes a &lt;strong&gt;&lt;em&gt;reference&lt;/em&gt;&lt;/strong&gt; to the System.Array object, therefore there is only one array in memory and the assignment to arr(0) affects the same array as seen from the Collection.
&lt;/p&gt;
&lt;p&gt;
This behavior can be the cause of a very subtle bug when converting a complex VB6 application to VB.NET, and &lt;font color="#3366ff"&gt;&lt;strong&gt;n&lt;/strong&gt;&lt;strong&gt;either Upgrade Wizard (included in Visual Studio) nor any VB6 conversion tool on the market can automatically solve this problem.&lt;/strong&gt;&lt;/font&gt; The first time we bumped into this problem it took us hours to track it down, and we wanted to save our customers such headaches. 
&lt;/p&gt;
&lt;p&gt;
Once you see where the problem is, you can fix it by simply cloning the array being stored to the collection 
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; col.Add(arr.Clone())&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
VB Migration Partner also offers an alternative solution to this problem, in the form of the &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2008/11/Speed-up-your-VBNET-collections.aspx" target="_blank"&gt;&lt;strong&gt;VB6Collection &lt;/strong&gt;&lt;/a&gt;class, which offers this and several other enhancement over the Microsoft.VisualBasic.Collection object. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=CJ8y3meTbIA:_XtYoyFvyNk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=CJ8y3meTbIA:_XtYoyFvyNk:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/A-subtle-collection-behavior.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/A-subtle-collection-behavior.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=1fb9eade-86b7-4f2a-af81-906a69ea3bdf</guid>
      <pubDate>Wed, 21 Oct 2009 11:09:00 -0800</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=1fb9eade-86b7-4f2a-af81-906a69ea3bdf</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=1fb9eade-86b7-4f2a-af81-906a69ea3bdf</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/A-subtle-collection-behavior.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=1fb9eade-86b7-4f2a-af81-906a69ea3bdf</wfw:commentRss>
    </item>
    <item>
      <title>Interview on .NET Rocks</title>
      <description>&lt;p&gt;
&amp;nbsp;
&lt;/p&gt;
&lt;p&gt;
&amp;nbsp;
&lt;img src="http://www.vbmigration.com/Blog/image.axd?picture=dotnetrocks.jpg" alt="" width="509" height="67" /&gt;
&lt;/p&gt;
&lt;p&gt;
Yesterday&lt;a href="http://www.dotnetrocks.com/default.aspx?showNum=491" target="_blank"&gt; .NET Rocks&lt;/a&gt; has finally published a long interview (63 minutes) with yours truly, about the migration of VB6 legacy apps and, of course, Code Architects&amp;#39; VB Migration Partner. 
&lt;/p&gt;
&lt;p&gt;
We touched many interesting topics and debased a few common myths about code migration. It was a great experience, thanks to Carl and Richar.
&lt;/p&gt;
&lt;p&gt;
At this time no PDF transcript is available, but one should be added in a few days. In the meantime you&amp;#39;ll have to keep up with my Italian accent, sorry &lt;img src="/Blog/admin/tiny_mce/plugins/emotions/images/smiley-laughing.gif" border="0" alt="Laughing" title="Laughing" /&gt; 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=v_BrAdyz81U:Q-jMwiicFUs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=v_BrAdyz81U:Q-jMwiicFUs:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/Interview-on-NET-Rocks.aspx</link>
      <author>Admin</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/Interview-on-NET-Rocks.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=bee03534-2a9c-47f9-bbcd-5345ff38bdc8</guid>
      <pubDate>Tue, 20 Oct 2009 23:46:00 -0800</pubDate>
      <dc:publisher>Admin</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=bee03534-2a9c-47f9-bbcd-5345ff38bdc8</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=bee03534-2a9c-47f9-bbcd-5345ff38bdc8</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/Interview-on-NET-Rocks.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=bee03534-2a9c-47f9-bbcd-5345ff38bdc8</wfw:commentRss>
    </item>
    <item>
      <title>Software modernization company Transoft chooses VB Migration Partner</title>
      <description>&lt;p&gt;
&lt;img src="/Images/Partners/transoft.jpg" alt="" /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.transoft.com" target="_blank"&gt;Transoft&lt;/a&gt; is a UK company that has a long tradition in software modernization. They offer both tools and services to migrate and modernize legacy apps written in Visual Basic, OpenVMS, IBM AS400, HP e3000, ICL VME, and others. They offer their products and services to both Europe and US and have an impressive list of achievements and customers of the caliber of DaimlerChrysler, DowChemical, and L&amp;#39;Oreal.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
Transoft is part of IRIS, a leading software company with over 1,000
employees worldwide. IRIS is the largest UK privately owned specialist
software business with an exceptional reputation for delivering market
leading solutions to more than 60,000 organizations, ranging from the
micro to the multinational business and including major charities and
membership organizations. 
&lt;/p&gt;
&lt;p&gt;
For all these reasons that we are VERY proud that, when looking for a software capable to automate most phases of the migration from VB6 and reduce migration time and cost, Transoft choosed Code Architects&amp;#39; VB Migration Partner over other similar and less powerful tools available on the market.&amp;nbsp; 
&lt;/p&gt;
&lt;p&gt;
If you are a US or UK company looking for a fast, cost-effective way to migrate and modernize your VB6 code, or just need support for your work with VB Migration Partner, you can contact Transoft or another of our &lt;a href="http://www.vbmigration.com/Blog/partners.aspx" target="_blank"&gt;partners &lt;/a&gt;that operate in your area. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=-hsf-N2mAEA:BREc0yZTkGc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=-hsf-N2mAEA:BREc0yZTkGc:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/Software-modernization-company-Transoft-chooses-VB-Migration-Partner.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/Software-modernization-company-Transoft-chooses-VB-Migration-Partner.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=3fe78cf9-bc1e-475f-9f1a-d0c893a02c18</guid>
      <pubDate>Tue, 13 Oct 2009 19:46:00 -0800</pubDate>
      <category>VB Migration Partner</category>
      <category>Partners</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=3fe78cf9-bc1e-475f-9f1a-d0c893a02c18</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=3fe78cf9-bc1e-475f-9f1a-d0c893a02c18</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/Software-modernization-company-Transoft-chooses-VB-Migration-Partner.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=3fe78cf9-bc1e-475f-9f1a-d0c893a02c18</wfw:commentRss>
    </item>
    <item>
      <title>[HOWTO] Fix ReDim statements that change the rank of an array</title>
      <description>&lt;p&gt;
Not all developers know that VB6 permits to dynamically change the rank (i.e. the number of dimensions) of an array, as in this code snippet:&lt;br /&gt;
&lt;br /&gt;
&lt;font face="courier new,courier"&gt;&amp;#39; this array can have 1 or 2 dimensions&lt;br /&gt;
Dim arr() As Integer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
Sub InitArray(rank As Integer)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim i As Integer, j As Integer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If rank = 1 Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReDim arr(100) As Integer&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 1 To UBound(arr)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arr(i) = i&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReDim arr(100, 20)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 1 To UBound(arr, 1)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For j = 1 To UBound(arr, 2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arr(i, j) = i * j&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;br /&gt;
&lt;/font&gt;VB.NET doesn&amp;rsquo;t allow you to change the rank of an array, therefore the converted VB.NET code would raise one instance of the following error:&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Number of indices exceeds the number of dimensions in the indexed array&lt;/em&gt;&lt;br /&gt;
&lt;br /&gt;
for each statement where the array is accessed with two indexes. These is no definitive solution to this problem, however VB Migration Partner allows you to significantly decrease the number of this compilation error, using a combination of pragmas:&lt;br /&gt;
&lt;br /&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#339966"&gt;&amp;#39;## ParseReplace Dim arr() As Integer, arr2() As Integer&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Dim arr() As Integer&lt;br /&gt;
&lt;font color="#339966"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;## arr2.ArrayRank 2&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;## PreProcess &amp;quot;arr(?=\([^,)]+,[^,)]+\))&amp;quot;, &amp;quot;arr2&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39;## PreProcess &amp;quot;(?&amp;lt;=(LBound|UBound)\()arr(?=,)&amp;quot;, &amp;quot;arr2&amp;quot;&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
An explanation of each pragma is in order. The &lt;strong&gt;ParseReplace &lt;/strong&gt;pragma causes VB Migration Partner to realize that there are actually two arrays (&lt;em&gt;arr &lt;/em&gt;and &lt;em&gt;arr2) &lt;/em&gt;and the &lt;strong&gt;ArrayRank &lt;/strong&gt;pragma specifies that &lt;em&gt;arr2 &lt;/em&gt;is a 2-dimensional array. The first subsequent &lt;strong&gt;PreProcess &lt;/strong&gt;pragma changes arr into &lt;em&gt;arr2 &lt;/em&gt;if the array reference is followed by two indexes that are separated by a comma &amp;ndash; as in &lt;em&gt;arr(1,2)&amp;nbsp; &lt;/em&gt;- whereas the second PreProcess pragma changes array references that appear in LBound and UBound method calls. The result is this piece of error-free VB.NET code:&lt;br /&gt;
&lt;br /&gt;
&lt;font face="courier new,courier"&gt;Private arr() As Short&lt;br /&gt;
Private arr2(,) As Short&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
Public Sub InitArray(ByRef rank As Short)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim i As Short&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Dim j As Short&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; If rank = 1 Then&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReDim arr(100)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 1 To UBound6(arr)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arr(i) = i&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp; Else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ReDim arr2(100, 20)&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; For i = 1 To UBound6(arr2, 1)&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; For j = 1 To UBound6(arr2, 2)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arr2(i, j) = i * j&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Next&lt;br /&gt;
&amp;nbsp;&amp;nbsp; End If&lt;br /&gt;
End Sub&lt;br /&gt;
&lt;/font&gt;&lt;br /&gt;
This approach isn&amp;#39;t bulletproof, though. In fact, it works only for array occurrences whose indexes aren&amp;#39;t function calls. For example, it doesn&amp;#39;t work in the following case: 
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; arr( GetIndex(1), GetIndex(2) )&lt;/font&gt; 
&lt;/p&gt;
&lt;p&gt;
However,&amp;nbsp; you can easily take care of these residual errors by means of additional ParseReplace or PreProcess pragmas. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=8frF_6Lnlmw:CKREOqC0Wlw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=8frF_6Lnlmw:CKREOqC0Wlw:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/HOWTO-Deal-with-ReDim-statements-that-change-the-rank-of-an-array.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/HOWTO-Deal-with-ReDim-statements-that-change-the-rank-of-an-array.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=667c9ce0-acf3-4729-a634-f09acd906650</guid>
      <pubDate>Thu, 08 Oct 2009 21:09:00 -0800</pubDate>
      <category>VB Migration Partner</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=667c9ce0-acf3-4729-a634-f09acd906650</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=667c9ce0-acf3-4729-a634-f09acd906650</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/HOWTO-Deal-with-ReDim-statements-that-change-the-rank-of-an-array.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=667c9ce0-acf3-4729-a634-f09acd906650</wfw:commentRss>
    </item>
    <item>
      <title>Code Architects' ADOLibrary, a revolutionary approach to ADODB to ADO.NET migration</title>
      <description>&lt;p&gt;
When migrating a VB6 legacy application, obtaining a working piece of VB.NET code is only part of the story. To complete the transition to the .NET world you also want to convert your database-access code to ADO.NET.&lt;br /&gt;
&lt;br /&gt;
The Upgrade Wizard that comes with Visual Studio doesn&amp;#39;t offer any option to upgrade ADODB code, with a good reason: &lt;strong&gt;&lt;font color="#3366ff"&gt;&amp;quot;traditional&amp;quot; code translators can&amp;#39;t automatically convert from ADODB to ADO.NET&lt;/font&gt;&lt;/strong&gt;, no matter how sophisticated the translator is. (More on this below)&lt;br /&gt;
&lt;br /&gt;
Fortunately, VB Migration Partner isn&amp;#39;t a &amp;quot;traditional&amp;quot; code conversion. We have already proved that it correctly translates many VB6 features and keywords that many &amp;quot;migration experts&amp;quot; swore that were impossible to translate automatically. &lt;a href="http://www.vbmigration.com/Blog/Blog/post/2009/08/NEW-RELEASE-VB-Migration-Partner-120---The-Definitive-Edition!.aspx" target="_blank"&gt;VB Migration Partner 1.20 supports &lt;strong&gt;*all* &lt;/strong&gt;the major VB6 features&lt;/a&gt;, inclduing Gosubs, Variants, graphic statements, drag-and-drop, DDE, and a lot more. &lt;br /&gt;
&lt;br /&gt;
After we dealt with the complete set of VB6 features, we decided to focus our attention on the challenges of porting ADODB-based code to ADO.NET.&lt;br /&gt;
&lt;br /&gt;
The result of our efforts is &lt;font color="#ff0000"&gt;&lt;strong&gt;Code Architects&amp;#39; ADOLibrary,&lt;/strong&gt;&lt;/font&gt; a revolutionary tool that makes ADODB-to-ADO.NET migration one or two orders of magnitudes simpler, faster, and less expensive.&lt;br /&gt;
&lt;br /&gt;
In a nutshell, ADOLibrary is a set of native .NET classes that behave exactly like their ADODB counterparts. For example, the ADOConnection object supports all the methods, properties, and events of the ADODB.Connection object, with exactly the same syntax and the same behavior. The same holds true for the ADORecordset class, the ADOCommand class, and ancillary classes such as ADOParameter, ADOField, and ADOProperty.&lt;br /&gt;
&lt;br /&gt;
ADOLibrary is currently in internal beta stage, but it already supports forwardonly-readonly cursors and client-side cursors with optimistic batch updates. We even and transparently support advanced ADODB programming techniques, such as asynchronous events and alternate update strategies (the Update Criteria property), for the benefit of demanding ADODB gurus out there.&lt;br /&gt;
&lt;br /&gt;
With its vast support for most ADODB features, ADOLibrary enables you to migrate thousands of database-related statements in a matter of hours. This is perhaps &lt;strong&gt;&lt;font color="#3366ff"&gt;100-200x faster &lt;/font&gt;&lt;/strong&gt;&lt;font color="#000000"&gt;than a manual migration&lt;/font&gt; and &lt;font color="#3366ff"&gt;&lt;strong&gt;10-20x more productive than any other code translator on the market&lt;/strong&gt;&lt;/font&gt;. In practical terms, it can save you weeks or months in a real-world migration project and &lt;font color="#3366ff"&gt;&lt;strong&gt;significantly reduce migration costs&lt;/strong&gt;&lt;/font&gt;.&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="2"&gt;&lt;strong&gt;The first ADOLibrary example&lt;/strong&gt;&lt;/font&gt;&lt;font size="2"&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font size="2"&gt;&lt;/font&gt;
Let me give you an idea of what the ADOLibrary works. Say that you have the following piece of VB6/ADODB code:&lt;br /&gt;
&lt;br /&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#3366ff"&gt;Dim &lt;/font&gt;cn &lt;font color="#3366ff"&gt;As New&lt;/font&gt; ADODB.Connection&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#3366ff"&gt;Dim &lt;/font&gt;rs &lt;font color="#3366ff"&gt;As New&lt;/font&gt; ADODB.Recordset&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#339966"&gt; &amp;#39; connect to Northwind&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cn.Open &amp;quot;Provider=SQLOLEDB.1;Initial Catalog=Northwind;...&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cn.CursorLocation = ADODB.adUseClient&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Open &amp;quot;Select * from Products &amp;quot;, cn, &lt;/font&gt;&lt;font face="courier new,courier"&gt;ADODB.&lt;/font&gt;&lt;font face="courier new,courier"&gt;adOpenStatic, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier"&gt;ADODB.&lt;/font&gt;&lt;font face="courier new,courier"&gt;adLockBatchOptimistic&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&amp;nbsp;&lt;font color="#339966"&gt;&amp;nbsp;&amp;nbsp; &amp;#39; Load a listbox with all product names&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#3366ff"&gt; Do Until &lt;/font&gt;rs.EOF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ListBox1.AddItem rs.Fields(&amp;quot;ProductName&amp;quot;).Value&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.MoveNext&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#3366ff"&gt;Loop&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
Here&amp;#39;s the VB.NET code that uses the ADOLibrary, as generated by VB Migration Partner:&lt;br /&gt;
&lt;br /&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#339966"&gt;&amp;#39; Assumes: Imports CodeArchitects.ADOLibrary&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Dim &lt;/font&gt;&lt;font face="courier new,courier"&gt;cn &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;As New &lt;/font&gt;&lt;font face="courier new,courier"&gt;ADOConnection&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Dim &lt;/font&gt;&lt;font face="courier new,courier"&gt;rs &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;As New&lt;/font&gt;&lt;font face="courier new,courier"&gt; ADORecordset&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#339966"&gt;&amp;#39; connect to Northwind&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cn.Open(&lt;font color="#ff0000"&gt;&amp;quot;Provider=SQLOLEDB.1;Initial Catalog=Northwind;...&amp;quot;&lt;/font&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cn.CursorLocation = ADOCursorLocation.adUseClient&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.Open(&lt;font color="#ff0000"&gt;&amp;quot;Select * from Products &amp;quot;&lt;/font&gt;, cn, ADOCursorType.adOpenStatic, _&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADOLockType.adLockBatchOptimistic)&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;
&lt;font color="#339966"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;#39; Load a listbox with all product names&amp;nbsp;&amp;nbsp; &lt;/font&gt;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Do Until &lt;/font&gt;&lt;font face="courier new,courier"&gt;rs.EOF&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ListBox1.AddItem(rs.Fields(&amp;quot;ProductName&amp;quot;).Value)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rs.MoveNext()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Loop&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
As you see, the VB.NET code is basically the same as the original VB6 code, except for the different class and enum names. Even more important, the code is perfectly equivalent to the original VB6 code&lt;br /&gt;
&lt;br /&gt;
If you are an ADODB developer you will find yourself comfortable with the generated code, which is as maintainable as the original VB6 code, except it leverages ADO.NET&amp;#39;s superior performance and scalability. &lt;strong&gt;&lt;font color="#3366ff"&gt;You are immediately productive &lt;/font&gt;&lt;/strong&gt;and don&amp;#39;t have to study ADO.NET, because our ADOLibrary hides the many differences between the two object models.&lt;br /&gt;
&lt;br /&gt;
Don&amp;#39;t let the ADODB-like syntax fool you, though: &lt;font color="#3366ff"&gt;&lt;strong&gt;ADOLibrary relies on ADO.NET objects exclusively and has no dependency on COM or ADODB&lt;/strong&gt;&lt;/font&gt;. It&amp;#39;s like having ADO.NET with an ADODB dress. 
&lt;/p&gt;
&lt;p&gt;
But the ADOLibrary is more than just an ADODB clone, because it exposes all the ADO.NET structures that it uses internally in addition to all the properties and methods &amp;quot;inherited&amp;quot; from ADODB.&lt;br /&gt;
&lt;br /&gt;
For example, the ADORecordset object exposes the inner DataTable object that stores the individual records. You can therefore bind the &amp;quot;recordset&amp;quot; to .NET controls and data grids. Or you can optimize the converted code as follows, and improve it to keep track of both the product name and the product ID:&lt;br /&gt;
&lt;font face="courier new,courier"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&lt;font color="#339966"&gt;&amp;nbsp; &amp;#39; Load a listbox with all product names&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ListBox1.ValueMember = &amp;quot;ProductID&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ListBox1.DisplayMember = &amp;quot;ProductName&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; ListBox1.DataSource = rs.DataTable&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#339966"&gt;&amp;#39; use native .NET binding!&lt;/font&gt;&lt;/font&gt;&lt;br /&gt;
&lt;br /&gt;
Thanks to the DataTable member, you can rely on .NET databinding to implement master-detail relationships, advanced data formatting, input validation, and so forth. Just keep in mind is that all these additions and fixes are optional, because the converted .NET code will work immediately as-is.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;font size="2"&gt;&lt;strong&gt;Why you can&amp;#39;t obtain ADODB-to-ADO.NET functional equivalence with a traditional code translator&lt;/strong&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
At least another VB6 conversion tool vendor claims that their product can handle ADODB to ADO.NET conversions by means of code transformation techniques. However, they don&amp;#39;t go into many details about which features are converted and which ones require some (or a lot of) manual fixes. &lt;br /&gt;
&lt;br /&gt;
The problem in automatic conversion of ADODB code to ADO.NET is two-fold. First and foremost, it is impossible to achieve full functional equivalence. Second, filling the gap between ADODB and ADO.NET by means of code transformations is that you end up generating verbose (and often illogical) code that is very hard to maintain and evolve in the future.   
&lt;/p&gt;
&lt;p&gt;
Consider the following trivial code snippet:
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Set &lt;/font&gt;&lt;font face="courier new,courier"&gt;cnNorthwind &lt;/font&gt;&lt;font color="#3366ff"&gt;&lt;font face="courier new,courier"&gt;As&lt;/font&gt;&lt;/font&gt;&lt;font face="courier new,courier"&gt; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;New &lt;/font&gt;&lt;font face="courier new,courier"&gt;ADODB.Connection&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Set &lt;/font&gt;&lt;font face="courier new,courier"&gt;rsOrders &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;As &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;New &lt;/font&gt;&lt;font face="courier new,courier"&gt;ADODB.Recordset&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier"&gt;cnNorthwind&lt;/font&gt;&lt;font face="courier new,courier"&gt;.Open &amp;quot;Provider=SQLOLEDB;Data Source=.;Initial Catalog=Northwind;Integrated Security=SSPI&amp;quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; rsOrders.Open &amp;quot;SELECT * FROM Orders&amp;quot;, db, &lt;/font&gt;&lt;font face="courier new,courier"&gt;ADODB.&lt;/font&gt;&lt;font face="courier new,courier"&gt;adOpenKeyset, &lt;/font&gt;&lt;font face="courier new,courier"&gt;_&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ADODB.&lt;/font&gt;&lt;font face="courier new,courier"&gt;adLockOptimistic&lt;/font&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Notice that this example uses server-side keyset cursors, that aren&amp;#39;t supported by ADO.NET. Keysets are typically used when you need to modify data in the database, therefore the closest ADO.NET structure that can perform the same task is the combination of a DataSet plus a DataAdapter. This is the best code that a conversion tool that relies solely on code transformation &lt;font face="courier new,courier"&gt;can generate&lt;/font&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;font face="courier new,courier"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Dim &lt;/font&gt;&lt;font face="courier new,courier"&gt;cnNorthwind &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;As New &lt;/font&gt;&lt;font face="courier new,courier"&gt;SqlConnection&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Dim &lt;/font&gt;&lt;font face="courier new,courier"&gt;rsOrders &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;As New &lt;/font&gt;&lt;font face="courier new,courier"&gt;DataSet&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; cnNorthwind.Open(&amp;quot;&lt;/font&gt;&lt;font face="courier new,courier"&gt;&lt;font color="#ff0000"&gt;Provider=SQLOLEDB;Data Source=.;Initial Catalog=Northwind;Integrated Security=SSPI&lt;/font&gt;&amp;quot;&lt;/font&gt;&lt;font face="courier new,courier"&gt;)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Dim &lt;/font&gt;&lt;font face="courier new,courier"&gt;cmd &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;As New &lt;/font&gt;&lt;font face="courier new,courier"&gt;SqlCommand&lt;/font&gt;&lt;font face="courier new,courier"&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier"&gt;cmd&lt;/font&gt;&lt;font face="courier new,courier"&gt;.Connection = cnNorthwind&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier"&gt;cmd&lt;/font&gt;&lt;font face="courier new,courier"&gt;.CommandText =&lt;font color="#ff0000"&gt; &amp;quot;SELECT * FROM Orders&amp;quot;&lt;/font&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;Dim &lt;/font&gt;&lt;font face="courier new,courier"&gt;da As &lt;/font&gt;&lt;font face="courier new,courier" color="#3366ff"&gt;New &lt;/font&gt;&lt;font face="courier new,courier"&gt;SqlDataAdapter(com.CommandText, com.Connection)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; adap.Fill(rs)&lt;/font&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;
Up to here, the converted code behaves more or less like the original VB6 code. However, the actual problems arise now. For example, consider that
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;the original ADODB code typicall uses a Do Until rsOrders.EOF loop to visit and possibly modify each record in the database. The loop can be transformed into a For Each loop that visits all the rows in the DataTable, but the database is updated only when the DataAdapter&amp;#39;s Update method is invoked.&lt;/li&gt;
	&lt;li&gt;when using a keyset on a locked record, you get a runtime error when you modify one or more fields and then move away from the current record. Conversely, the optimistic lock used by the DataAdapter.Update throws a single error when any record in the DataTable fails to update. The two models greatly differ, so expect a lot of manual fixes in this area.&lt;/li&gt;
	&lt;li&gt;The example shows a simple SELECT query, however many VB6 apps retrieve (and update) by means of queries or stored procedures with parameters. ADODB and ADO.NET mechanisms for retrieving and using stored proc parameters are very different and this gap can&amp;#39;t be filled by writing some code. Besides, the .NET CommandBuilder.DeriveParameters method has several defects and can&amp;#39;t be used in production code, thus in practice you are forced to define all the query parameters manually in code. &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
It isn&amp;#39;t at all surprising that our competitors don&amp;#39;t provide any code sample that shows how their tool converts these (and many other) ADODB basic features, such as Recordset and Connection events, transactions, and bookmarks. Not to mention more advanced ones such as the Update Criteria property and the Resync method. 
&lt;/p&gt;
&lt;p&gt;
In practice, we estimate that a traditional code translator can automate no more than 10-15% of the statements that read, write, and process data stored in a database. &lt;font color="#3366ff"&gt;&lt;strong&gt;Is 15% enough to qualify for ADODB-to-ADO.NET automatic conversion?&lt;/strong&gt;&lt;/font&gt; 
&lt;/p&gt;
Our competitor also claims that their tool can convert code in a database-agnostic fashion. In .NET parlance, it means that they generate code that uses objects in the System.Data.Common namespace exclusively, e.g. DbConnection and DbCommand. You might believe that it&amp;#39;s a good approach at writing database-agnostic code, until you see how ADOLibrary solves the same problem. 
&lt;p&gt;
Internally, ADOLibrary uses the .NET objects in the System.Data.Common namespace, therefore it is inherently database-agnostic. When it&amp;#39;s time to create a concrete class, by default ADOLibrary instantiates the objects in the System.Data.OleDb namespace (e.g. OleDbConnection, OleDbCommand, and so forth), and is therefore as database-agnostic as the original ADODB code. However, this is just the default behavior and you can override it by simply setting a global property.&lt;br /&gt;
&lt;br /&gt;
For example, if your application is designed to work with Microsoft SQL Server exclusively, you can have ADOLibrary instantiate concrete classes in the System.Data.SqlClient namespace, which delivers faster and more scalable code. To enable this optimization you just need to add the following single statement:&lt;font face="courier new,courier"&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp; &amp;nbsp;ADOConfig.LibraryKind = ADOLibraryKind.SqlClient&lt;br /&gt;
&lt;/font&gt;&lt;br /&gt;
That&amp;#39;s it! No need to be confused with base classes or other similar annoyances! &lt;img src="/Blog/admin/tiny_mce/plugins/emotions/images/smiley-wink.gif" border="0" alt="Wink" title="Wink" /&gt;&lt;br /&gt;
&lt;br /&gt;
For even more flexibility, you can read the value of the LibraryKind property from the configuration file, to let your end users customize the application for the database they actually use, without you having to recompile your code. Talk about flexibility! 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=jfsBPf1nH4o:G_WXlL0zz_c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=jfsBPf1nH4o:G_WXlL0zz_c:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/10/Introducing-ADOLibrary,-a-revolutionary-approach-to-ADODB-to-ADONET-migration.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/10/Introducing-ADOLibrary,-a-revolutionary-approach-to-ADODB-to-ADONET-migration.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=9db57824-19d5-44cc-8692-7754ad245038</guid>
      <pubDate>Fri, 02 Oct 2009 02:32:00 -0800</pubDate>
      <category>VB Migration Partner</category>
      <category>Optimization</category>
      <category>Tools</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=9db57824-19d5-44cc-8692-7754ad245038</pingback:target>
      <slash:comments>6</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=9db57824-19d5-44cc-8692-7754ad245038</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/10/Introducing-ADOLibrary,-a-revolutionary-approach-to-ADODB-to-ADONET-migration.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=9db57824-19d5-44cc-8692-7754ad245038</wfw:commentRss>
    </item>
    <item>
      <title>A .NET library to access Windows Vista and Windows 7 features</title>
      <description>&lt;p&gt;
One of the reasons to migrate your code to .NET is create modern user interface that take advantage of the power of newer versions of Windows. On the other hand, the .NET Framework has been designed to work in the same way over a wide range of Windows versions, including versions that are about ten years old, and therefore it doesn&amp;#39;t provide access to the most intriguing features of Vista and Windows 7.
&lt;/p&gt;
&lt;p&gt;
The solution comes in a new library from Microsoft, named &lt;a href="http://code.msdn.microsoft.com/WindowsAPICodePack" target="_blank"&gt;Windows API Code Pack for .NET Framework&lt;/a&gt;. Version 1.0 of this great tool has been just released, and already implements an impressive range of Windows features:
&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Windows 7 Taskbar Jump Lists, Icon Overlay, Progress Bar, Tabbed Thumbnails, and Thumbnail Toolbars.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Windows 7 Libraries, Known Folders, non-file system containers.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Windows Shell Search API support, a hierarchy of Shell Namespace entities, and Drag and Drop functionality for Shell Objects.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Explorer Browser Control.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Shell property system.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Windows Vista and Windows 7 Common File Dialogs, including custom controls.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Windows Vista and Windows 7 Task Dialogs.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Direct3D 11.0, Direct3D 10.1/10.0, DXGI 1.0/1.1, Direct2D 1.0, DirectWrite, Windows Imaging Component (WIC) APIs. (DirectWrite and WIC have partial support)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Sensor Platform APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Extended Linguistic Services APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Power Management APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Application Restart and Recovery APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Network List Manager APIs&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Command Link control and System defined Shell icons.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Shell Search API support.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Drag and Drop functionality for Shell objects.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Support for Direct3D and Direct2D interoperability.&lt;/li&gt;
&lt;/ul&gt;
&lt;ul&gt;
	&lt;li&gt;Support for Typography and Font enumeration DirectWrite APIs.&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The library comes with an extensive help file and all code samples are available in both VB.NET and C#. Last but not the least, the entire source code is provided. 
&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=X8461TBMitM:qgcV7EWZSpA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/VbMigrationPartner?a=X8461TBMitM:qgcV7EWZSpA:bcOpcFrp8Mo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/VbMigrationPartner?d=bcOpcFrp8Mo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
      <link>http://www.vbmigration.com/Blog/post/2009/09/A-NET-library-to-access-Windows-Vista-and-Windows-7-features.aspx</link>
      <author>Francesco Balena</author>
      <comments>http://www.vbmigration.com/Blog/post/2009/09/A-NET-library-to-access-Windows-Vista-and-Windows-7-features.aspx#comment</comments>
      <guid>http://www.vbmigration.com/Blog/post.aspx?id=fa6124b9-5881-4f53-a3c0-b4a15a458884</guid>
      <pubDate>Wed, 16 Sep 2009 15:58:00 -0800</pubDate>
      <category>VB.NET</category>
      <category>Tools</category>
      <category>Resources</category>
      <dc:publisher>Francesco Balena</dc:publisher>
      <pingback:server>http://www.vbmigration.com/Blog/pingback.axd</pingback:server>
      <pingback:target>http://www.vbmigration.com/Blog/post.aspx?id=fa6124b9-5881-4f53-a3c0-b4a15a458884</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://www.vbmigration.com/Blog/trackback.axd?id=fa6124b9-5881-4f53-a3c0-b4a15a458884</trackback:ping>
      <wfw:comment>http://www.vbmigration.com/Blog/post/2009/09/A-NET-library-to-access-Windows-Vista-and-Windows-7-features.aspx#comment</wfw:comment>
      <wfw:commentRss>http://www.vbmigration.com/Blog/syndication.axd?post=fa6124b9-5881-4f53-a3c0-b4a15a458884</wfw:commentRss>
    </item>
  </channel>
</rss>
