{"id":3373,"date":"2005-02-17T20:47:00","date_gmt":"2005-02-17T20:47:00","guid":{"rendered":"https:\/\/blogs.msdn.microsoft.com\/heaths\/2005\/02\/17\/x86-and-ia64-and-x64-oh-my\/"},"modified":"2005-02-17T20:47:00","modified_gmt":"2005-02-17T20:47:00","slug":"x86-and-ia64-and-x64-oh-my","status":"publish","type":"post","link":"https:\/\/devblogs.microsoft.com\/setup\/x86-and-ia64-and-x64-oh-my\/","title":{"rendered":"x86 and ia64 and x64, oh my!"},"content":{"rendered":"<p>With the .NET Framework 2.0 now&nbsp;<a href=\"http:\/\/msdn.microsoft.com\/netframework\/downloads\/updates\/default.aspx\">supporting<\/a>&nbsp;64-bit platforms, I have begun work on upgrading our patch build system to handle 64-bit patches. It&#8217;s been quite an adventure down the yellow-brick road of 64 bitness that I think is worth sharing.<\/p>\n<p>Why does the .NET Framework need to support 64-bit platforms, though? While most IL modules embedded in assemblies &#8211; which are still <a href=\"http:\/\/msdn.microsoft.com\/msdnmag\/issues\/02\/02\/PE\/default.aspx\">PE\/COFF executables<\/a>&nbsp;&#8211; are architecturally agnostic some are not, like <em>CustomMarshalers.dll<\/em> or <em>mscorelib.dll<\/em>. In these cases both 32- and 64-bit assemblies are required. Because 32-bit code will run under 64-bit <a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/win64\/win64\/wow64_implementation_details.asp\">Windows under Windows-on-Windows 64 (WOW64)<\/a>&nbsp;32-bit processes still may need access to the 32-bit assemblies either in the GAC or in the Framework version directory (ex: <em>%windir%Microsoft.NETFrameworkv2.0.<\/em>nnnn). For code running natively under 64-bit Windows, access to 64-bit assemblies is necessary. These files are installed side by side. If you have .NET 2.0 installed and look in <em>%windir%assembly<\/em> you&#8217;ll see a new column in the shell view that tells you if the assembly is MSIL, x86, or AMD64 or IA64. Future versions should, by the way, should replace &#8220;AMD64&#8221; with &#8220;x64&#8221;.<\/p>\n<p>So what is difference between x86, AMD64, IA64, and x64? x86 is what most everyone is running now &#8211; 32-bit processes on 32-bit Windows. <a href=\"http:\/\/www.amd.com\/us-en\/Processors\/ProductInformation\/0,,30_118,00.html\">AMD64<\/a>&nbsp;is Advanced Micro Devices, Inc.&#8217;s answer to 64-bit computing that runs 32-bit code natively as well. This means that you can install 32-bit Windows on an AMD64 machine. These machines have already begun shipping with 32-bit&nbsp;Windows XP&nbsp;and a friend of mine in MN is already running one happily. <a href=\"http:\/\/www.intel.com\/design\/itanium\/family\/index.htm\">IA64<\/a> &#8211; or Intel Itanium &#8211; processors run 64-bit natively and offer 32-bit emulation, but you cannot install 32-bit Windows on it. You need to run <a href=\"http:\/\/www.microsoft.com\/windowsserver2003\/64bit\/ipf\/default.mspx\">Windows Server 2003 for 64-bit Itanium-based Systems<\/a>. Intel has also introduced <a href=\"http:\/\/developer.intel.com\/technology\/64bitextensions\/\">EM64T<\/a> &#8211; or Extended Memory 64 Technolocy &#8211; for Intel Xeon processors. This processor also supports running 32-bit processes natively like the AMD64.<\/p>\n<p>x64 is the term Microsoft uses to collectively refer to processors that run both 32- and 64-bit code natively without emulation &#8211; both AMD64 and EM64T. There are flavors of both <a href=\"http:\/\/www.microsoft.com\/windowsxp\/64bit\/default.mspx\">Windows XP<\/a> and <a href=\"http:\/\/www.microsoft.com\/windowsserver2003\/64bit\/x64\/default.mspx\">Windows Server 2003<\/a> that currently run on x64 which is poised to become the predominant 64-bit computer technology it would seem.<\/p>\n<p>So patches need to come in three flavors: x86, ia64, and x64. The latter two patches will contain both 32- and 64-bit binaries for the reasons given above and will be larger in size. While normally x86 code would run under WOW64 on 64-bit systems, the 32-bit release setups and patches will block on 64-bit systems (at the time&nbsp;this was published) to make sure that both 32- and 64-bit binaries are present.<\/p>\n<p>To decrease patch size and present a better end-user experience, we are looking to implement a 32-bit native wrapper for all three architectures. OS detection will be used in conjunection with the MSI <a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/template_summary_property.asp\">Template summary property<\/a> of the MSI package embedded in the native executable to present a more user-friendly error message if a user accidentally downloads and tries installing a 64-bit patch on a 32-bit system. Currently, the Windows executable loader would simple display, &#8220;&lt;file&gt; is not a valid Win32 application.&#8221;&nbsp; This works because the 32-bit MSI APIs can install a <a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/msi\/setup\/64_bit_windows_installer_packages.asp\">64-bit MSI package or patch<\/a> using the 64-bit Windows Installer service, so no <a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/win64\/win64\/file_system_redirector.asp\">file system<\/a> or <a href=\"http:\/\/msdn.microsoft.com\/library\/en-us\/win64\/win64\/registry_redirector.asp\">registry redirection<\/a> will occur.<\/p>\n<p><strong>Updated:<\/strong> The 4th paragraph mistakenly stated that x64 refers to both AMD64 and <strong>IA64<\/strong>. This was supposed to have read EM64T, not IA64.<\/p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>With the .NET Framework 2.0 now&nbsp;supporting&nbsp;64-bit platforms, I have begun work on upgrading our patch build system to handle 64-bit patches. It&#8217;s been quite an adventure down the yellow-brick road of 64 bitness that I think is worth sharing. Why does the .NET Framework need to support 64-bit platforms, though? While most IL modules embedded [&hellip;]<\/p>\n","protected":false},"author":389,"featured_media":3843,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[4,14,20],"class_list":["post-3373","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","tag-64-bit","tag-development","tag-installation"],"acf":[],"blog_post_summary":"<p>With the .NET Framework 2.0 now&nbsp;supporting&nbsp;64-bit platforms, I have begun work on upgrading our patch build system to handle 64-bit patches. It&#8217;s been quite an adventure down the yellow-brick road of 64 bitness that I think is worth sharing. Why does the .NET Framework need to support 64-bit platforms, though? While most IL modules embedded [&hellip;]<\/p>\n","_links":{"self":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/posts\/3373","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/users\/389"}],"replies":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/comments?post=3373"}],"version-history":[{"count":0,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/posts\/3373\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/media\/3843"}],"wp:attachment":[{"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/media?parent=3373"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/categories?post=3373"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devblogs.microsoft.com\/setup\/wp-json\/wp\/v2\/tags?post=3373"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}