Updated sample .NET Framework detection code that does more in-depth checking
I previously posted some sample code to detect the version(s) and service pack levels of the .NET Framework that are installed on a computer (here and here). The original version of the sample code that I wrote queries the officially documented registry values that are used to detect the presence of each specific version of the .NET Framework.
Since I posted this sample code, I have heard feedback from some customers who are including the .NET Framework as part of their setup packages. They indicated that sometimes this code reports false positives - in other words, the sample returns true for a specific version of the .NET Framework but it isn't actually installed on the system. I have seen this a couple of times in the past as well, and the root cause was that some of the registry entries used to detect the .NET Framework were orphaned on the system after an uninstall or OS reinstall scenario.
In order to help address this type of issue, I've created a new version of the sample code that adds some new checks to help guard against orphaned registry values. The logic it uses is to query the registry values like the previous sample used to, and then to supplement that with an additional check that loads mscoree.dll and uses some of its APIs to query for the presence of specific versions of the .NET Framework. The underlying algorithm for this mscoree.dll-based check came from Junfeng Zhang and from a sample published on MSDN.
This algorithm should prove more reliable in detecting whether or not a specific version of the .NET Framework is installed on the system because it does not rely solely on the registry. In addition, it provides the side benefit of performing a quick health check for the .NET Framework itself because it attempts to invoke some APIs in the runtime.
The new sample code contains the following specific changes from the previous version that I published:
- Added the CheckNetfxVersionUsingMscoree and GetProcessorArchitectureFlag functions
- Added logic in WinMain to call CheckNetfxVersionUsingMscoree in addition to the original calls to check .NET Framework registry data
- Updated the code to use strsafe.h functions for string manipulations
You will need the following in order to compile this sample:
- Visual Studio 2005 or Visual C++ 2005 Express Edition
- The .NET Framework 2.0 SDK or at least the header file mscoree.h from that version of the SDK
Please let me know if you have any trouble building or running this sample or incorporating it into your product setup logic.
<update date="5/29/2009"> Fixed broken link to the sample code. </update>
Comments
Anonymous
August 03, 2006
PingBack from http://blogs.msdn.com/astebner/articles/574618.aspxAnonymous
August 17, 2006
PingBack from http://newyear2006.wordpress.com/2006/08/17/net-framework-20-existenz-feststellen/Anonymous
March 20, 2007
I've received a few questions recently about how to programmatically detect whether or not the .NET FrameworkAnonymous
June 15, 2007
It has been a while since I've written about any setup issues related to Update Rollup 2 for Media CenterAnonymous
June 15, 2007
PingBack from http://msdnrss.thecoderblogs.com/2007/06/15/update-rollup-2-setup-can-fail-because-it-does-not-detect-the-net-framework-11-sp1/Anonymous
July 18, 2007
The comment has been removedAnonymous
November 29, 2007
Now that the .NET Framework 3.5 has been released , I have posted an updated version of the .NET FrameworkAnonymous
November 29, 2007
Now that the .NET Framework 3.5 has been released , I have posted an updated version of the .NET FrameworkAnonymous
May 15, 2008
PingBack from http://www.walkernews.net/2008/05/16/how-to-check-net-framework-version-installed/Anonymous
August 18, 2008
Question: I have downloaded both versions of the sample .NET Framework version detection code (describedAnonymous
December 05, 2008
Thanks a ton for this! I have made a user friendly modification to produce a single MessageBox, which can then be copied to the clipboard using CTRL-C (and sent back to the mother ship) producing:
.NET Framework Versions Installed
.NET Framework 1.0 service pack 3 is installed. .NET Framework 1.1 service pack 1 is installed. .NET Framework 2.0 service pack 2 is installed. .NET Framework 3.0 service pack 2 is installed. .NET Framework 3.5 service pack 1 is installed.
OK
Cheers! David Rogers
Anonymous
December 06, 2008
Hi DavidWRogers - Those sound like helpful changes, and I'm glad you found the sample useful. Also, note that there is now a web-based version of this check available at http://www.smallestdotnet.com. It isn't exactly the same - it only lists the most recent version you have installed and what the smallest download is to get you updated to the .NET Framework 3.5 SP1, but this type of checking might be useful in some scenarios. There is also more detail about what that web page does at http://www.hanselman.com/blog/SmallestDotNetOnTheSizeOfTheNETFramework.aspx, and in that page there is a script snippet you can embed in your web page to provide equivalent functionality.Anonymous
June 14, 2009
PingBack from http://rapid-dev.net/2009/06/is-there-an-easy-way-to-check-net-framework-verison-using-c/Anonymous
December 28, 2009
I have developed an ActiveX control using c# and .net framework 2.0. If this has to be deployed on a client m/c and the m/c does not have .net framework what should we do? I have used the following code to detect the framework since I cannot read the registry in the client m/c from aspx page. When I invoke the method it detects .net framework 2.0 is not installed. The user clicks on a link from the main page and goes to the popup window to install the .net framework 2.0. if (Request.Browser.Browser.ToUpper() == "IE"){ Version[] versionArray = Request.Browser.GetClrVersions(); foreach (Version version in versionArray) { if (version.ToString().StartsWith("2.") || version.ToString().StartsWith("3.")) { bldotNetFramework2 = true; break; } } if (!bldotNetFramework2) { Response.Redirect(sdlURL + "/Home.aspx"); } When the user comes back to the main page and click refresh it still says .net framework 2.0 not installed. But If I close and re-open the browser then main page detects .net framework 2.0. How do we resolve this? Any help would be appreciated.Anonymous
December 28, 2009
Hi Nitingel - I'm not sure there is anything better you can do in this scenario. The .NET Framework installer adds a registry value during its setup process that updates the browser version information, so that update won't be visible until you re-open the browser. Applications that require Silverlight have the same type of issue when they request that their users install Silverlight - the Silverlight installer tells them that they need to re-open the browser. You may want to add that type of message to your pop-up window to handle this scenario.Anonymous
April 10, 2011
Thanks for the src! http://www.asoft.be also has a nice one that I use and it's kept uptodate. There is no source but it's the one that I package to customers. It's called .NET version detector. My 2ctsAnonymous
August 14, 2011
Hey Oliver, thanks for the post. It was most helpful. KevinAnonymous
January 31, 2013
The links for the "new sample code" seem to be broken.. :(Anonymous
January 31, 2013
Hi George - The links appear to be working fine for me. What error do you see when you try to click on the links?Anonymous
November 01, 2015
The GetRequestedRuuntimeInfo API has been deprecated in the .NET Framework 4