CINXE.COM
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" > <html> <head><script type="text/javascript" src="/_static/js/bundle-playback.js?v=HxkREWBo" charset="utf-8"></script> <script type="text/javascript" src="/_static/js/wombat.js?v=txqj7nKC" charset="utf-8"></script> <script>window.RufflePlayer=window.RufflePlayer||{};window.RufflePlayer.config={"autoplay":"on","unmuteOverlay":"hidden"};</script> <script type="text/javascript" src="/_static/js/ruffle/ruffle.js"></script> <script type="text/javascript"> __wm.init("https://web.archive.org/web"); __wm.wombat("http://msdn.microsoft.com:80/msdnmag/issues/06/00/PureC/default.aspx","20080205003004","https://web.archive.org/","web","/_static/", "1202171404"); </script> <link rel="stylesheet" type="text/css" href="/_static/css/banner-styles.css?v=S1zqJCYt" /> <link rel="stylesheet" type="text/css" href="/_static/css/iconochive.css?v=3PDvdIFv" /> <!-- End Wayback Rewrite JS Include --> <title id="pagetitle">Pure C++: Hello, C++/CLI -- MSDN Magazine, Visual Studio 2005 Guided Tour</title> <meta name="Description" content="C++/CLI is a self-contained, component-based dynamic programming language that, like C# or Java, is derived from C++. In fact, you can look at it as a natural step in the evolution of C. Stanley Lippman, who was there from the beginning, provides some insight."/> <meta http-equiv="PICS-Label" content="(PICS-1.1 "http://www.rsac.org/ratingsv01.html" l comment "RSACi North America Server" by "inet@microsoft.com" r (n 0 s 0 v 0 l 0))"> <meta name="MS.LOCALE" content="en-us"/> <meta name="save" content="history"> <meta http-equiv="Content-Type" content="text/html; CHARSET=UTF-8"> <meta name="Robots" content="all"> <script type="text/javascript" language="Javascript" src="/web/20080205003004js_/http://msdn.microsoft.com/mnp_utility.mspx/menujs?mnpshell=%2fmsdnmag%2fissues%2f06%2f00%2fconfig_issue.xml&clicktrax=False"></script> <link type="text/css" rel="Stylesheet" href="/web/20080205003004cs_/http://msdn.microsoft.com/library/mnp/2/aspx/css.aspx?locale=en-us&name=QuickSearch&name=Menu&static=Page"/> <script type="text/javascript" language="Javascript" src="/web/20080205003004js_/http://msdn.microsoft.com/msdnmag/js/msdnmag.js"></script> <link type="text/css" rel="Stylesheet" href="/web/20080205003004cs_/http://msdn.microsoft.com/msdnmag/css/mag.css"/> <link rel="stylesheet" type="text/css" href="/web/20080205003004cs_/http://msdn.microsoft.com/library/toolbar/3.0/css.aspx?c=/msdnmag/issues/06/00/config_issue.xml"/><script language="JavaScript">var doImage=doImage;var TType=TType; function mhHover(tbl,idx,cls){var t,d;if(document.getElementById)t=document.getElementById(tbl);else t=document.all(tbl);if(t==null)return;if(t.getElementsByTagName)d=t.getElementsByTagName("TD");else d=t.all.tags("TD");if(d==null)return;if(d.length<=idx)return;d[idx].className=cls;} function footerjs(doc){if(doImage==null){var tt=TType==null?"PV":TType;doc.write('<layer visibility="hide"><div style="display:none"><img src="https://web.archive.org/web/20080205003004/http://c.microsoft.com/trans_pixel.asp?source=msdn&TYPE=' + tt + '&p=msdnmag_issues_06_00_PureC&URI=%2fmsdnmag%2fissues%2f06%2f00%2fPureC%2fdefault.aspx&GUID=1F4FC18C-F71E-47FB-8FC9-612F8EE59C61" width=0 height=0 hspace=0 vspace=0 border=0 /></div></layer>');}}</script><script language="JavaScript" src="/web/20080205003004js_/http://msdn.microsoft.com/library/svy/broker.js"></script> </head> <body topmargin="0" leftmargin="0"> <!--NOINDEX_START--><script language="Javascript"> if (self.name == "MNPMainFrame") top.location.href = self.location.href; </script><div id="msviMasthead"><table cellpadding="0" cellspacing="0" width="100%" border="0"><tr><td width="100%"><table cellpadding="0" cellspacing="0" width="100%" height="22" border="0"><tr><td id="msviRegionIdGraphic" bgcolor="#FFFFFF"></td><td width="100%" bgcolor="#3568CC"><img src="/web/20080205003004im_/http://msdn.microsoft.com/library/toolbar/3.0/gradient.aspx?a=FFFFFF&b=3568CC&w=250&h=22&d=ltr&c=RkWooiSyZq0Yx5DIezuYpFhZ%2ffA%3d" width="250" height="22" alt="*" title=""/></td></tr></table></td><td id="msviGlobalToolbar" bgcolor="#3568CC" height="22" nowrap="" dir="ltr" align="left"><table cellpadding="0" cellspacing="0" border="0"><tr><td class="gt0" nowrap="nowrap" onmouseover="mhHover('msviGlobalToolbar', 0, 'gt1')" onmouseout="mhHover('msviGlobalToolbar', 0, 'gt0')"><a href="https://web.archive.org/web/20080205003004/http://www.microsoft.com/">Microsoft.com Home</a></td><td class="gtsep">|</td><td class="gt0" nowrap="nowrap" onmouseover="mhHover('msviGlobalToolbar', 2, 'gt1')" onmouseout="mhHover('msviGlobalToolbar', 2, 'gt0')"><a href="/web/20080205003004/http://msdn.microsoft.com/library/toolbar/3.0/sitemap/en-us.mspx">Site Map</a></td></tr></table></td></tr><tr valign="top"><td width="100%"><table cellpadding="0" cellspacing="0" width="100%" height="42" border="0" style="height: expression(parentElement.offsetHeight)"><tr valign="top"><td id="msviBrandBanner" bgcolor="FFFFFF"><a href="https://web.archive.org/web/20080205003004/http://msdn.microsoft.com/"><img src="/web/20080205003004im_/http://msdn.microsoft.com/library/toolbar/3.0/images/banners/msdn_masthead_ltr.gif" width="225" height="42" alt="MSDN" title="" border="0"/></a></td><td width="100%" bgcolor="#6799FF"><img src="/web/20080205003004im_/http://msdn.microsoft.com/library/toolbar/3.0/gradient.aspx?a=FFFFFF&b=6799FF&w=250&h=42&d=ltr&c=87hrt6fb9uyj4Xgg%2f0ZD3dLE36E%3d" width="250" height="42" alt="*" title=""/></td></tr></table></td><td id="msviGlobalSearch" bgcolor="#6799FF"><div id="msviNoSearch"></div></td></tr></table><div id="msviLocalToolbar"><table cellpadding="0" cellspacing="0" width="100%" height="19" border="0"><tr><td nowrap="nowrap" id="msviHomePageLink"><a href="/web/20080205003004/http://msdn.microsoft.com/default.aspx">MSDN Home</a></td><td><span class="ltsep">|</span></td><td class="lt0" nowrap="nowrap" onmouseover="mhHover('msviLocalToolbar', 2, 'lt1')" onmouseout="mhHover('msviLocalToolbar', 2, 'lt0')"><a href="/web/20080205003004/http://msdn.microsoft.com/developercenters/">Developer Centers</a></td><td><span class="ltsep">|</span></td><td class="lt0" nowrap="nowrap" onmouseover="mhHover('msviLocalToolbar', 4, 'lt1')" onmouseout="mhHover('msviLocalToolbar', 4, 'lt0')"><a href="/web/20080205003004/http://msdn.microsoft.com/library/default.asp">Library</a></td><td><span class="ltsep">|</span></td><td class="lt0" nowrap="nowrap" onmouseover="mhHover('msviLocalToolbar', 6, 'lt1')" onmouseout="mhHover('msviLocalToolbar', 6, 'lt0')"><a href="/web/20080205003004/http://msdn.microsoft.com/downloads/">Downloads</a></td><td><span class="ltsep">|</span></td><td class="lt0" nowrap="nowrap" onmouseover="mhHover('msviLocalToolbar', 8, 'lt1')" onmouseout="mhHover('msviLocalToolbar', 8, 'lt0')"><a href="/web/20080205003004/http://msdn.microsoft.com/howtobuy/">How to Buy</a></td><td><span class="ltsep">|</span></td><td class="lt0" nowrap="nowrap" onmouseover="mhHover('msviLocalToolbar', 10, 'lt1')" onmouseout="mhHover('msviLocalToolbar', 10, 'lt0')"><a href="/web/20080205003004/http://msdn.microsoft.com/subscriptions/">Subscribers</a></td><td><span class="ltsep">|</span></td><td class="lt0" nowrap="nowrap" onmouseover="mhHover('msviLocalToolbar', 12, 'lt1')" onmouseout="mhHover('msviLocalToolbar', 12, 'lt0')"><a href="/web/20080205003004/http://msdn.microsoft.com/worldwide.aspx">Worldwide</a></td><td width="100%"></td></tr></table></div></div> <table cellpadding="0" cellspacing="0" border="0" width="100%" dir="LTR"> <tr valign="top"> <td height="100%" style="overflow-x: hidden" width="181"><table cellpadding="0" cellspacing="0" border="0" width="100%"><tr><td class="mnpQuickSearch" style="background: #CCCCCC; color: #000000" dir="LTR"><form style="margin: 0px" action="/web/20080205003004/http://msdn.microsoft.com/msdn-online/shared/components/mscomsearch30.aspx"><nobr><font color="#000000">Search for</font><br><input class="mnpSearchBox" type="text" id="qu" name="qu" maxlength="255" style="width: 165px"><br><table cellpadding="0" cellspacing="0" border="0" width="100%" style="margin-top: 2px"><tr><td width="100%" class="mnpQuickSearch" style="padding: 0px"><select class="mnpSearchScopes" style="width: 137px" name="SearchScope"><option value="1">MSDN and KB</option><option value="2">MSDN Library</option><option value="3">Code and Downloads</option><option value="7" selected="">MSDN Magazine</option><option value="5">Knowledge Base (KB)</option></select></td><td><input class="mnpSearchButton" type="submit" value="Go"><br></td></tr></table><a href="https://web.archive.org/web/20080205003004/http://search.microsoft.com/search/search.aspx?View=msdn&st=a" style="color: #000000" onmouseover="style.color='#0033CC';" onmouseout="style.color='#000000';">Advanced Search</a></nobr></form></td></tr></table><div id="mnpMenuTop" class="mnpMenuTop" style="overflow-x: hidden; width: 181px" url="/msdnmag/issues/06/00/PureC/default.aspx" dir="LTR" parent="/msdnmag/issues/06/00/default.aspx"><div class="mnpInherit"><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/default.aspx">MSDN Magazine Home</a></div><div class="mnpMenuBorder" style="width: 180px"></div><div class="mnpMenuRow" style="border-color: #999999; width: 153px; overflow-x: hidden" menu="mde10db8578844163ad68edaaa4fcd7b0"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/06/00/default.aspx">Visual Studio 2005 Guided Tour</a></div><div class="mnpMenuBorder" style="width: 180px"></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden" menu="m66be025db64f7146f504e0fec1b2bae3"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/find/default.aspx">Search</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden" menu="m3fd9abd6d4e6b1d47da1677743a69def"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/code.aspx">Source Code</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden" menu="m0e5c80cdf8bdd73274e5171bd96f4ed9"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/backissues.aspx">Back Issue Archive</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden" menu="mbf75615e0c7b0b018a47f1aaa4e9b7b9"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/columns/default.aspx">Column Archive</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/rss/default.aspx">RSS</a></div><div class="mnpMenuBorder" style="width: 180px"></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/Subscribe.aspx">Subscribe</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/backissues/default.aspx">Order Back Issues</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/service.aspx">Reader Services</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/staff.aspx">Meet the Staff</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/authors.aspx">Meet the Authors</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="https://web.archive.org/web/20080205003004/http://www.sdmediagroup.com/msdnmag/mediakit/mediakit.htm">Media Kit</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/cdrom/default.aspx">Special CD and DVD Offers</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/podcast/default.aspx">Podcast</a></div><div class="mnpMenuBorder" style="width: 180px"></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/submit.aspx">Submit an Article</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/write.aspx">Write to Us</a></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/correct.aspx">Corrections</a></div><div class="mnpMenuBorder" style="width: 180px"></div><div class="mnpMenuRow" style="border-color: #F1F1F1; background: #F1F1F1; width: 153px; overflow-x: hidden"><img width="4" height="7" border="0" alt="*" title="" class="mnpMenuArrow" src="/web/20080205003004im_/http://msdn.microsoft.com/library/mnp/2/gif/arrowLTR.gif" style="left: 166px; visibility: hidden"><a href="/web/20080205003004/http://msdn.microsoft.com/isapi/gomscom.asp?TARGET=/technet/technetmag/default.aspx">TechNet Magazine</a></div><div class="mnpMenuBorder" style="width: 180px; margin-bottom: 0px"></div></div></div><div class="mnpAds" style="width: 181px; height: 100%; padding-bottom: 20px; background: #F1F1F1; border-style: solid; border-color: #999999; border-width: 0px 1px 0px 0px"><center><div style="height: 20px; background: inherit"></div><a href="https://web.archive.org/web/20080205003004/http://estore.websitepros.com/1779793/StoreFront.bok" target="_blank"><img border="0" src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/promo/ad1.gif" alt="MSDN Magazine Archive CD"></a><br><div style="height: 20px; background: inherit"></div><a href="https://web.archive.org/web/20080205003004/http://www.odc2008.com/" target="_blank"><img border="0" src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/promo/ad2.gif" alt="http://www.odc2008.com"></a><br></center></div></td> <td width="100%" dir="LTR"> <table width="100%" cellpadding="0" cellspacing="0" height="46" bgcolor="#3366CC"><tr><td width="419"><img border="0" src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/magsub.gif" width="419" height="46" alt="MSDN Magazine"></td><td width="100%" title="MSDN Magazine" background="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx" bgcolor="#3366CC"> </td></tr></table><!--NOINDEX_STOP--> <!-----------------> <!--BEGIN_CONTENT--> <!-----------------> <div class="eyebrow"><a class="small" href="/web/20080205003004/http://msdn.microsoft.com/default.aspx">MSDN Home</a> > <a class="small" href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/default.aspx">MSDN Magazine</a> > <a class="small" href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/06/00/default.aspx">Visual Studio 2005 Guided Tour</a><hr></div> <table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td class="clsDocBody"><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td bgcolor="#003399" align="center" colspan="2"><img vspace="5" hspace="5" src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/headers/PureC.gif" width="167" height="23" alt="Pure C++"></td></tr><tr><td bgcolor="#ffffcc" height="20" colspan="2" class="clsDeck"><b>Hello, C++/CLI</b></td></tr><tr><td height="2" bgcolor="#ffffff" colspan="2"></td></tr><tr><td height="2" bgcolor="#336699" colspan="2"></td></tr></table><br><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td width="*"><div class="pd" xmlns:user="http://msdn.microsoft.com"><a title="More articles by this author" href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/find/?type=Au&phrase=Stanley%20B.%20Lippman&words=exact">Stanley B. Lippman</a></div></td><td width="175"><div align="right" id="menu_parent" xmlns:user="http://msdn.microsoft.com"><table border="0" cellpadding="3" cellspacing="0"><tr valign="bottom" align="center"><td><a id="Print" title="Print a printer-friendly version of this page" href="default.aspx?loc=&print=true" onmouseover="window.status='Print This Page';return true" onmouseout="window.status='';return true" onclick="PrintButtonClick();return false;"><img border="0" src="/web/20080205003004im_/http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_print.gif" alt=""></a></td><td><a href="#bottom"><img border="0" src="/web/20080205003004im_/http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_email.gif" alt=""></a></td><td><a href="#bottom"><img border="0" src="/web/20080205003004im_/http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_save.gif" alt=""></a></td><td><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/rss/rss.aspx?Sub=Pure%20C%2B%2B"><img border="0" src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/rss.gif" alt=""></a></td><td><a href="#bottom"><img border="0" src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/rate.gif" alt=""></a></td><td><a href="#" onclick="return false;">more ...</a></td></tr></table></div><div align="right" style="float: right; width: 175px;" xmlns:user="http://msdn.microsoft.com"><div id="menu_child" style="z-index:100; align:right; border: 1px solid #999999; background-color: white; width: 175px; padding: 5px"><table width="100%" border="0" cellpadding="2" cellspacing="3"><tr><td width="30" valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_print.gif" alt=""></td><td width="140" valign="middle"><a id="Print" title="Print a printer-friendly version of this page" href="default.aspx?loc=&print=true" onmouseover="window.status='Print This Page';return true" onmouseout="window.status='';return true" onclick="PrintButtonClick();return false;">Print</a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_email.gif" alt=""></td><td valign="middle"><a href="#bottom">E-mail</a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdn-online/shared/graphics/icons/rtg_save.gif" alt=""></td><td valign="middle"><a href="#bottom">Add to Favorites</a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/rate.gif" alt=""></td><td valign="middle"><a href="#bottom">Rate</a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/rss.gif" alt=""></td><td valign="middle"><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/rss/rss.aspx?Sub=Pure%20C%2B%2B">RSS (Pure C++) </a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/addtoany.gif" alt=""></td><td valign="middle"><a href="https://web.archive.org/web/20080205003004/http://www.addtoany.com/?linkname=Pure%20C%2B%2B&type=rss&linkurl=http://msdn.microsoft.com/msdnmag/rss/rss.aspx?Sub=Pure%20C%2B%2B"> Add RSS to Any </a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdn-online/shared/graphics/icons/library.gif" alt=""></td><td valign="middle"><a href="#bottom">Related Articles</a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/spaces.gif" alt=""></td><td valign="middle"><a target="_blank" href="https://web.archive.org/web/20080205003004/http://spaces.live.com/blogit.aspx?Title=Pure C++:+Hello, C++/CLI&Description=C++/CLI is a self-contained,&#160;component-based dynamic programming language that, like C# or Java, is derived from C++. In fact, you can look at it as a natural step in the evolution of C. Stanley Lippman, who was there from the beginning, provides some insight.&SourceURL=http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx"> Live Spaces </a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/digg.gif" alt=""></td><td valign="middle"><a target="_blank" href="https://web.archive.org/web/20080205003004/http://digg.com/submit?phase=2&url=http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx&title=Pure C++:+Hello, C++/CLI&bodytext=C++/CLI is a self-contained,&#160;component-based dynamic programming language that, like C# or Java, is derived from C++. In fact, you can look at it as a natural step in the evolution of C. Stanley Lippman, who was there from the beginning, provides some insight.&topic=programming "> Digg This </a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/blogger.gif" alt=""></td><td valign="middle"><a target="_blank" href="https://web.archive.org/web/20080205003004/http://new.blogger.com/blog_this.pyra?t=C++/CLI is a self-contained,&#160;component-based dynamic programming language that, like C# or Java, is derived from C++. In fact, you can look at it as a natural step in the evolution of C. Stanley Lippman, who was there from the beginning, provides some insight.&u=http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx&n='Pure C++:+Hello, C++/CLI,'bloggerForm','scrollbars=no,width=475,height=300,top=175,left=75,status=yes,resizable=yes"> BlogThis! </a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/slashdot.gif" alt=""></td><td valign="middle"><a target="_blank" href="https://web.archive.org/web/20080205003004/http://slashdot.org/bookmark.pl?url=http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx&title=Pure C++:+Hello, C++/CLI"> Slashdot </a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/delicious.gif" alt=""></td><td valign="middle"><a target="_blank" href="https://web.archive.org/web/20080205003004/http://del.icio.us/post?url=http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx&title=Pure C++:+Hello, C++/CLI"> del.icio.us </a></td></tr><tr><td valign="middle" align="center"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/interactive/technorati.png" alt=""></td><td valign="middle"><a target="_blank" href="https://web.archive.org/web/20080205003004/http://technorati.com/faves?add=http://msdn.microsoft.com/msdnmag/issues/06/00/PureC/default.aspx"> Technorati </a></td></tr></table></div></div><script type="text/javascript" xmlns:user="http://msdn.microsoft.com"> at_attach("menu_parent", "menu_child", "hover", "y", "pointer"); </script></td></tr></table><br><hr><table border="0" cellpadding="0" cellspacing="0" width="100%"><tr><td width="50%"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/minus.gif" class="clsImgButton" vspace="2" hspace="5" height="9" width="9" alt="" align="absmiddle" id="contentbtn" onclick="ToggleMenu(contentbtn, contentmenu);"><a href="#void" target="_self" onclick="ToggleMenu(contentbtn, contentmenu);" name="contents"><b>Contents</b></a><br><div style="display:block;margin-left:20px;margin-top:10px;" id="contentmenu"><a target="_self" href="#S1">What is C++/CLI?</a><br><a target="_self" href="#S2">Learning C++/CLI </a><br><a target="_self" href="#S3">Mapping C++/CLI to the CTS?</a><br><a target="_self" href="#S4">CLI Level of Detail </a><br><a target="_self" href="#S5">What Are the Issues?</a><br><a target="_self" href="#S6"> Additional Functionality </a><br><a target="_self" href="#S7">So, What Did You Say About C++/CLI?</a><br></div></td></tr></table><hr><br><div class="articletext"><p class="clsNoIndent"><span class="clsGloss">C++/CLI is a self-contained,</span> component-based dynamic programming language that, like C# or Java, is derived from C++. Unlike those languages, however, we have worked hard to integrate C++/CLI into ISO-C++, using the historical model of evolving the C/C++ programming language to support modern programming paradigms. You can say that C++/CLI is to C++ as C++ is to C. More generally, you can view the evolution leading to C++/CLI in the following historical context: <ul><li>BCPL (Basic Computer Programming Language)</li><li>B (Ken Thompson, original UNIX work)</li><li>C (Dennis Ritchie, adding type and control structure to B)</li><li>C with Classes (~1979)</li><li>C84 (~1984)</li><li>Cfront, release E (~1984-to universities)</li><li>Cfront, release 1.0 (1985-to the world )—20th birthday</li><li>Multiple/Virtual Inheritance (MI) programming (~1988)</li><li>Generic Programming (~1991) (templates)</li><li>ANSI C++/ ISO-C++ (~1996)</li><li>Dynamic Component programming (~2005) (C++/CLI)</li></ul></p><br><a name="S1"></a><span class="clsSubhead">What is C++/CLI?</span><br><p>C++/CLI represents a tuple. C++ refers, of course, to the C++ programming language invented by Bjarne Stroustrup at Bell Laboratories. It supports a static object model that is optimized for the speed and size of its executables. However, it doesn't support run-time modification of the program other than heap allocation. It allows unlimited access to the underlying machine, but very little access to the types active in the running program and no real access to the associated infrastructure of that program. Herb Sutter, a former colleague of mine at Microsoft and the chief architect of C++/CLI, refers to C++ as a concrete language.</p><p>CLI refers to the Common Language Infrastructure, a multitiered architecture supporting a dynamic component programming model. In many ways, this represents a complete reversal of the C++ object model. A runtime software layer, the virtual execution system, runs between the program and the underlying operating system. Access to the underlying machine is fairly constrained. Access to the types active in the executing program and the associated program infrastructure—both as discovery and construction—is supported. The slash (/) represents a binding between C++ and the CLI. The details surrounding this binding make up the general topic of this column.</p><p>So, a first approximation of an answer to what is C++/CLI is that it is a binding of the static C++ object model to the dynamic component object model of the CLI. In short, it is how you do .NET programming using C++ rather than C# or Visual Basic®. Like C# and the CLI itself, C++/CLI is undergoing standardization under the European Computer Manufacturers Association (ECMA) and eventually under ISO.</p><p>The common language runtime (CLR) is the Microsoft version of the CLI that is specific to the Windows® operating system. Similarly, Visual C++® 2005 is the implementation of C++/CLI.</p><p>As a second approximation of an answer, I would say that C++/CLI integrates the .NET programming model within C++ in the same way as, back at Bell Laboratories, we integrated generic programming using templates within the then existing C++. In both of these cases your investment in an existing C++ codebase and in your existing C++ expertise are preserved. This was an essential baseline requirement of the design of C++/CLI.</p><div style="margin-top:5px;" align="right"><a onclick="OpenMenu(contentbtn, contentmenu);" target="_self" href="#contents" class="clsSmall"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" height="8" border="0" alt="Back to top" align="bottom" style="margin-left:5px;"></a></div><br><a name="S2"></a><span class="clsSubhead">Learning C++/CLI </span><br><p>There are three aspects in the design of a CLI language that hold true across all languages: a mapping of language-level syntax to the underlying Common Type System (CTS), the choice of a level of detail to expose the underlying CLI infrastructure to the manipulation of the programmer, and the choice of additional functionality to provide, beyond that supported directly by the CLI.</p><p>The first item is largely the same across all CLI languages. The second and third items are where one CLI language distinguishes itself from another. Depending on the kinds of problems you need to solve, you'll choose one or another language, or possibly combine multiple CLI languages. Learning C++/CLI involves understanding each of these aspects of its design.</p><div style="margin-top:5px;" align="right"><a onclick="OpenMenu(contentbtn, contentmenu);" target="_self" href="#contents" class="clsSmall"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" height="8" border="0" alt="Back to top" align="bottom" style="margin-left:5px;"></a></div><br><a name="S3"></a><span class="clsSubhead">Mapping C++/CLI to the CTS?</span><br><p>It is important when programming C++/CLI to learn the underlying CTS, which includes these three general class types: <ul><li>The polymorphic reference type, which is what you use for all class inheritance.</li><li>The non-polymorphic value type, which is used for implementing concrete types requiring runtime efficiency, such as the numeric types.</li><li>The abstract interface type, which is used for defining a set of operations common to a set of either reference or value types that implement the interface.</li></ul></p><p>This design aspect, the mapping of the CTS to a set of built-in language types, is common across all CLI languages although, of course, the syntax varies in each CLI language. So, for example, in C#, you would write <pre class="clsCode"> abstract class Shape { ... } // C# </pre> to define an abstract Shape base class from which specific geometric objects are to be derived, while in C++/CLI you write <pre class="clsCode"> ref class Shape abstract { ... }; // C++/CLI </pre> to indicate the exact same underlying CLI reference type. The two declarations are represented exactly the same way in the underlying IL. Similarly, in C#, you write <pre class="clsCode"> struct Point2D { ... } // C# </pre> to define a concrete Point2D class, while in C++/CLI you write: <pre class="clsCode"> value class Point2D { ... }; // C++/CLI </pre></p><p> The family of class types supported with C++/CLI represents an integration of the CTS with the native facilities, and that determines your choice of syntax. For example: <pre class="clsCode"> class native {}; value class V {}; ref class R {}; interface class I {}; </pre></p><p> The CTS also supports an enumeration class type that behaves somewhat differently from the native enumeration, and support is provided for both of those as well: <pre class="clsCode"> enum native { fail, pass }; enum class CLIEnum : char { fail, pass}; </pre> Similarly, the CTS supports its own array type that again behaves differently from the native array. And again Microsoft provides support for both: <pre class="clsCode"> int native[] = { 1,1,2,3,5,8 }; array<int>^ managed = { 1,1,2,3,5,8 }; </pre></p><p> No CLI language is closer to or more nearly a mapping to the underlying CTS than another. Rather, each CLI language represents a view into the underlying CTS object model.</p><div style="margin-top:5px;" align="right"><a onclick="OpenMenu(contentbtn, contentmenu);" target="_self" href="#contents" class="clsSmall"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" height="8" border="0" alt="Back to top" align="bottom" style="margin-left:5px;"></a></div><br><a name="S4"></a><span class="clsSubhead">CLI Level of Detail </span><br><p>The second design aspect that must be considered when designing a CLI language is the level of detail of the underlying CLI implementation model to incorporate into the language. What kind of problems will the language be tasked to solve? Does the language have the tools necessary to do this? Also, what sort of programmers is the language likely to attract?</p><p>Take, for example, the issue of value types occurring on the managed heap. Value types can find themselves on the managed heap in a number of circumstances: <ul><li>Through implicit boxing, when an instance of a value type is assigned to an Object or when a virtual method is invoked through a value type that is not overridden.</li><li>When that value type is serving as a member of a reference class type.</li><li>When that value type is being stored as the element type of a CLI array.</li></ul> Whether the programmer should be allowed to manipulate the address of a value type of this sort is a CLI language design consideration that must be addressed.</p><div style="margin-top:5px;" align="right"><a onclick="OpenMenu(contentbtn, contentmenu);" target="_self" href="#contents" class="clsSmall"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" height="8" border="0" alt="Back to top" align="bottom" style="margin-left:5px;"></a></div><br><a name="S5"></a><span class="clsSubhead">What Are the Issues?</span><br><p>Any object located on the managed heap is subject to relocation during the compaction phase of a sweep of the garbage collector. Any pointers to that object must be tracked and updated by the runtime; the programmer cannot manually track it herself. Therefore, if you were allowed to take the address of a value type that might be on the managed heap, there would need to be a tracking form of pointer in addition to the existing native pointer.</p><p>What are the trade-offs to consider? On the one hand, there's simplicity and safety. Directly introducing support in the language for either one or a family of tracking pointers makes it a more complicated language. By not supporting this, the available pool of programmers is expanded because less sophistication is required. In addition, allowing the programmer access to these ephemeral value types increases the possibility of programmer error—she may purposely or inadvertently do dangerous things to the memory. By not supporting tracking pointers, a potentially safer runtime environment is created.</p><p>On the other hand, efficiency and flexibility must be considered. Each time you assign the same Object with a value type, a new boxing of the value occurs. Allowing access to the boxed value type allows in-memory update, which may provide significant performance improvements. Without a form of tracking pointer, you cannot iterate over a CLI array using pointer arithmetic. This means that the CLI array cannot participate in the Standard Template Library (STL) iterator pattern and work with the generic algorithms. Allowing access to the boxed value type allows significant design flexibility.</p><p>Microsoft chose to provide a collection of addressing modes that handle value types on the managed heap in C++/CLI: <pre class="clsCode"> int ival = 1024; int^ boxedi = ival; array<int>^ ia = gcnew array<int>{1,1,2,3,5,8}; interior_ptr<int> begin = &ia[0]; value struct smallInt { int m_ival; ... } si; pin_ptr<int> ppi = &si.m_ival; </pre></p><p> The typical C++/CLI developer is a sophisticated system programmer tasked with providing infrastructure and organizationally critical applications that serve as the foundation over which a business builds its future. She must address both scalability and performance concerns and must therefore have a system-level view into the underlying CLI. The level of detail of a CLI language reflects the face of its programmer.</p><p>Complexity is not in itself a negative quality. Human beings are more complicated than single-cell bacteria, and that is certainly not a bad thing. However, when the expression of a simple concept is made complicated, that is usually considered to be a bad thing. In C++/CLI, the CLI team has tried to provide an elegant way to express complex subject matter.</p><div style="margin-top:5px;" align="right"><a onclick="OpenMenu(contentbtn, contentmenu);" target="_self" href="#contents" class="clsSmall"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" height="8" border="0" alt="Back to top" align="bottom" style="margin-left:5px;"></a></div><br><a name="S6"></a><span class="clsSubhead"> Additional Functionality </span><br><p>A third design aspect is a language-specific layer of functionality above and beyond what is directly supported by the CLI. This may require a mapping between the language-level support and the underlying implementation model of the CLI. In some cases, this just isn't possible because the language cannot intercede with the behavior of the CLI. One example of this is the virtual function resolution in the constructor and destructor of a base class. To reflect ISO-C++ semantics in this case would require a resetting of the virtual table within each base class constructor and destructor. This is not possible because virtual table handling is managed by the runtime and not by the individual language.</p><p>So this design aspect is a compromise between what would be preferable to do, and what is feasible. The three primary areas of additional functionality that are provided by C++/CLI are the following: <ul><li>A form of Resource Acquisition is Initialization (RAII) for reference types, in particular, to provide an automated facility for what is referred to as deterministic finalization of garbage- collected types that hold scarce resources.</li><li>A form of deep-copy semantics associated with the C++ copy constructor and copy assignment operator; however, these semantics could not be extended to value types.</li><li>Direct support of C++ templates for CTS types in addition to the CLI generic mechanism. In addition, a verifiable version of the STL for CLI types is provided.</li></ul></p><p>Let's look at a brief example: the issue of deterministic finalization. Before the memory associated with an object is reclaimed by the garbage collector, an associated Finalize method, if present, is invoked. You can think of this method as a kind of super-destructor since it is not tied to the program lifetime of the object. This is called finalization. The timing of just when or even whether a Finalize method is invoked is undefined. This is what is meant by nondeterministic finalization of the garbage collector.</p><p>Nondeterministic finalization works well with dynamic memory management. When available memory gets sufficiently scarce, the garbage collector kicks in and solves the problem. Nondeterministic finalization does not work well, however, when an object maintains a critical resource such as a database connection, a lock of some sort, or perhaps native heap memory. In this case, it would be great to release the resource as soon as it is no longer needed. The solution that is currently supported by the CLI is for a class to free the resources in its implementation of the Dispose method of the IDisposable interface. The problem here is that Dispose requires an explicit invocation, and therefore is not likely to be invoked.</p><p>A fundamental design pattern in C++ is the aforementioned Resource Acquisition is Initialization, which means that a class acquires resources within its constructor. Conversely, a class frees its resources within its destructor. This is managed automatically within the lifetime of the class object.</p><p>Here's what reference types should do in terms of the freeing of scarce resources: <ul><li>Use the destructor to encapsulate the necessary code for the freeing of any resources associated with the class.</li><li>Have the destructor invoked automatically, tied with the lifetime of the class object.</li></ul></p><p>The CLI has no notion of the class destructor for a reference type. So the destructor has to be mapped to something else in the underlying implementation. Internally, then, the compiler performs the following transformations: <ul><li>The class has its base class list extended to inherit from the IDisposable interface.</li><li>The destructor is transformed into the Dispose method of IDisposable.</li></ul></p><p>That represents half of the goal. A way to automate the invocation of the destructor is still needed. A special stack-based notation for a reference type is supported; that is, one in which its lifetime is associated within the scope of its declaration. Internally, the compiler transforms the notation to allocate the reference object on the managed heap. With the termination of the scope, the compiler inserts an invocation of the Dispose method—the user-defined destructor. Reclamation of the actual memory associated with the object remains under the control of the garbage collector. <a class="clsFigs" target="_self" href="default.aspx?loc=&fig=true#fig1" onclick="OpenUrl('default.aspx?loc=&fig=true#fig1'); return false;" xmlns:user="http://msdn.microsoft.com">Figure 1</a> shows an example.</p><p>C++/CLI is not just an extension of C++ into the managed world. Rather, it represents a fully integrated programming paradigm similar in extent to the earlier integration of the multiple inheritance and generic programming paradigms into the language. I think the team has done an outstanding job.</p><div style="margin-top:5px;" align="right"><a onclick="OpenMenu(contentbtn, contentmenu);" target="_self" href="#contents" class="clsSmall"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" height="8" border="0" alt="Back to top" align="bottom" style="margin-left:5px;"></a></div><br><a name="S7"></a><span class="clsSubhead">So, What Did You Say About C++/CLI?</span><br><p>C++/CLI represents an integration of native and managed programming. In this iteration, that has been done through a kind of separate but equal community of source-level and binary elements, including Mixed mode (source-level mix of native and CTS types, plus a binary mix of native and CIL object files), Pure mode (source-level mix of native and CTS types, all compiled to CIL object files), Native classes (can hold CTS types through a special wrapper class only), and CTS classes (can hold native types only as pointers). Of course, the C++/CLI programmer can also choose to program in the CLI types alone, and in this way provide verifiable code that can be hosted, for example, as a stored procedure in SQL Server<sup class="clsSmall">™</sup> 2005.</p><p>So, returning to the question, what is C++/CLI? It is a first-class entry visa into the .NET programming model. With C++/CLI, there is a C++ migration path not just for the C++ source base but for C++ expertise as well. I find great satisfaction in that.</p><div style="margin-top:5px;" align="right"><a onclick="OpenMenu(contentbtn, contentmenu);" target="_self" href="#contents" class="clsSmall"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" height="8" border="0" alt="Back to top" align="bottom" style="margin-left:5px;"></a></div><br><span class="clsGloss">Send your questions and comments to <a href="https://web.archive.org/web/20080205003004/mailto:purecpp@microsoft.com">purecpp@microsoft.com</a>. </span><br></div><hr><span class="clsBio"><b>Stanley B. Lippman</b> began working on C++ with its inventor Bjarne Stroustrup back in 1984 within Bell Laboratories. Later, Stan worked in feature animation both at Disney and DreamWorks and served as a Software Technical Director on Fantasia 2000. He has since served as Distinguished Consultant with JPL and as an Architect with the Visual C++ team at Microsoft.</span><br><hr><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/subscribe.aspx"><img height="44" width="121" src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/promo/subbutton.gif" alt="Subscribe" border="0" style="margin:0px 0px 0px 0px;vertical-align:top;align:left;"></a> From the <a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/06/00/default.aspx">Visual Studio 2005 Guided Tour</a> issue of <a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/default.aspx">MSDN Magazine</a>. <hr><a name="bottom"></a><a href="#top" class="clsSmall" style="float:left;"><img src="/web/20080205003004im_/http://msdn.microsoft.com/msdnmag/images/top.gif" width="18" height="8" border="0" alt="Back to top">Back to top </a><span style="float:right;"><b>QJ: </b>560002</span><br><hr><span class="clsSmall">© 2007 Microsoft Corporation and CMP Media, LLC. All rights reserved; reproduction in part or in whole without permission is prohibited.</span></td><td width="150"><iframe src="https://web.archive.org/web/20080205003004if_/http://www.ddj.com/msdnads/msdn_premium.jhtml" scrolling="no" frameborder="0" width="145" height="2000"></iframe></td></tr></table> <table border="0" cellpadding="0" cellspacing="0" width="100%"> <tr> <td class="clsDocBody"> <div> <span class="clsSubhead"> Related Articles from MSDN Magazine: </span> </div> <div> <!-- --> <ul><li><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/07/06/CSharp30"><b>C# 3.0:</b> The Evolution Of LINQ And Its Impact On The Design Of C# by Anson Horton</a></li><li><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/05/01/ASPNETPerformance"><b>ASP.NET:</b> 10 Tips for Writing High-Performance Web Applications by Rob Howard</a></li><li><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/1100/gci"><b>Garbage Collection:</b> Automatic Memory Management in the Microsoft .NET Framework by Jeffrey Richter</a></li><li><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/07/12/Maps"><b>Map LINQ:</b> Create Dynamic Maps with Visual Basic 9.0 and WPF by Scott Wisniewski</a></li><li><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/08/01/PHPandIIS7"><b>IIS 7.0:</b> Enhance Your Apps with the Integrated ASP.NET Pipeline by Mike Volodarsky</a></li><li><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/08/02/CompilerWriting"><b>Roll Your Own:</b> Create a Language Compiler for the .NET Framework by Joel Pobar</a></li><li><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/01/12/NETServ"><b>Windows Services:</b> New Base Classes in .NET Make Writing a Windows Service Easy by Ken Getz</a></li><li><a href="/web/20080205003004/http://msdn.microsoft.com/msdnmag/issues/04/07/MustHaveTools"><b>.NET Tools:</b> Ten Must-Have Tools Every Developer Should Download Now by James Avery</a></li></ul> </div> </td> <td width="150"> </td> </tr> </table> <!-----------------> <!--END_CONTENT--> <!-----------------> </td> </tr> </table> <!--NOINDEX_START--><br clear="all" style="line-height: 1px; overflow: hidden"/><table id="msviFooter" width="100%" cellpadding="0" cellspacing="0"><tr valign="bottom"><td id="msviFooter2" style="filter:progid:DXImageTransform.Microsoft.Gradient(startColorStr='#FFFFFF', endColorStr='#669AFF', gradientType='1')"><div id="msviLocalFooter"><nobr><a href="https://web.archive.org/web/20080205003004/http://go.microsoft.com/?linkid=317027">Manage Your Profile</a> |</nobr><wbr/><nobr><a href="/web/20080205003004/http://msdn.microsoft.com/isapi/gomscom.asp?TARGET=/legal/" target="_parent">Legal</a> |</nobr><wbr/><nobr><a href="https://web.archive.org/web/20080205003004/http://go.microsoft.com/?linkid=2028439" target="_parent">Contact us</a> |</nobr><wbr/><nobr><a href="/web/20080205003004/http://msdn.microsoft.com/flash/" target="_parent">MSDN Flash Newsletter</a></nobr></div><div id="msviGlobalFooter"><span dir="ltr">© 2008 Microsoft Corporation. All rights reserved. </span><nobr><a href="https://web.archive.org/web/20080205003004/http://www.microsoft.com/info/cpyright.mspx">Terms of Use</a> |</nobr><wbr/><nobr><a href="/web/20080205003004/http://msdn.microsoft.com/library/toolbar/3.0/trademarks/en-us.mspx">Trademarks</a> |</nobr><wbr/><nobr><a href="https://web.archive.org/web/20080205003004/http://www.microsoft.com/info/privacy.mspx">Privacy Statement</a></nobr></div></td><td bgcolor="#669AFF" width="105"><img src="/web/20080205003004im_/http://msdn.microsoft.com/library/toolbar/3.0/text.aspx?t=TQ%3d%3d&f=FFFFFF&b=669AFF&font=Microsoft+Logo+95%2c+13pt&w=105&h=29&a=0&l=0&v=0&c=eAdQAhJgwJihw2DKZGDGx4FnKIM%3d" width="105" height="29" alt="Microsoft" title="" border="0"/></td></tr></table><layer visibility="hide"><div style="display:none"><img width="0" height="0" border="0" hspace="0" vspace="0" src="https://web.archive.org/web/20080205003004im_/http://c.microsoft.com/trans_pixel.asp?source=msdn&TYPE=PV&p=msdnmag_issues_06_00_PureC&URI=%2fmsdnmag%2fissues%2f06%2f00%2fPureC%2fdefault.aspx&GUID=1F4FC18C-F71E-47FB-8FC9-612F8EE59C61"></div></layer> <script language="javascript" type="text/javascript"> var gDomain="m.webtrends.com"; var gDcsId="dcsmgru7m99k7mqmgrhudo0k8_8c6m"; var gTrackEvents=1; var wtsp="_msdnmag_" var gFpc="WT_FPC";if(document.cookie.indexOf(gFpc+"=")==-1){document.write("<SCR"+"IPT TYPE='text/javascript' SRC='"+"http"+(window.location.protocol.indexOf('https:')==0?'s':'')+"://"+gDomain+"/"+gDcsId+"/wtid.js"+"'><\/SCR"+"IPT>");} </script> <script src="/web/20080205003004js_/http://msdn.microsoft.com/webtrends.js" type="text/javascript"></script> <noscript> <img alt="" border="0" id="DCSIMG" width="1" height="1" src="https://web.archive.org/web/20080205003004im_/http://m.webtrends.com/dcsmgru7m99k7mqmgrhudo0k8_8c6m/njs.gif?dcsuri=/nojavascript&WT.js=No"> </noscript> </body> </html> <!-- FILE ARCHIVED ON 00:30:04 Feb 05, 2008 AND RETRIEVED FROM THE INTERNET ARCHIVE ON 06:54:26 Nov 27, 2024. JAVASCRIPT APPENDED BY WAYBACK MACHINE, COPYRIGHT INTERNET ARCHIVE. ALL OTHER CONTENT MAY ALSO BE PROTECTED BY COPYRIGHT (17 U.S.C. SECTION 108(a)(3)). --> <!-- playback timings (ms): captures_list: 0.699 exclusion.robots: 0.037 exclusion.robots.policy: 0.021 esindex: 0.012 cdx.remote: 6.122 LoadShardBlock: 1259.567 (3) PetaboxLoader3.resolve: 1212.765 (4) PetaboxLoader3.datanode: 139.287 (4) load_resource: 154.948 -->