.NET Framework Support on Windows Operating Systems

 

Hans Verbeeck
Microsoft EMEA

September 2002

Applies to:
   Microsoft® .NET Framework
   Microsoft® Windows® operating systems

Summary: Provides information about which versions of Microsoft Windows that the Microsoft .NET Framework can be installed on. Software requirements of the .NET Framework and exceptions to the general platform support are listed. Explains how to prepare applications for cross-platform support. (14 printed pages)

Contents

Supported Platforms
.NET Framework Software Requirements
Preparing for Cross-Platform Support
Appendix

Supported Platforms

The .NET Framework can be installed on the platforms shown in Table 1.

Table 1. Platforms the .NET Framework can be installed on

Supports all of the .NET Framework except Microsoft ASP.NET Supports the entire .NET Framework
Windows 98 Windows 2000 (all versions—no Service Packs required)
Windows 98 SE Windows XP Professional
Windows ME  
Windows NT 4.0 (all versions - Service Pack 6a required)  
Windows XP Home Edition  

The first thing to notice is that the .NET Framework will not run at all on Windows 95. This is consistent with other Microsoft® products like Microsoft® Office XP that also do not support Windows 95.

The operating systems, on which the .NET Framework will run, can be divided in two groups: one that will run the .NET Framework with ASP .NET and one that will run it without. This can also be seen as the distinction between operating systems that can be used as a server for .NET applications and operating systems that should be used as clients running .NET applications. Note that all of the versions of Windows NT 4.0, even the Server edition, should be regarded as a client operating system for .NET applications.

Besides ASP .NET, there are only minor differences between the functionality supported by the .NET Framework on different platforms. For example, Windows 98 and Windows ME don't have an event-logging system, and the .NET Framework installed on these systems will therefore not support the Eventlog and related objects from the System.Diagnostics namespace.

Another area where some differences can be found is XML Enterprise Services. Windows NT 4.0 supported the installation Microsoft® Transaction Server (MTS), which is different from COM+ 1.0 which came with Windows 2000, or COM+ 1.5 which comes with Windows XP. XML Enterprise Services in the .NET Framework will only work with COM+ 1.0 or higher, so the functionality offered through the System.EnterpriseServices namespace won't be available at all on Windows NT 4.0 and will be partially available on Windows 2000.

The appendix gives a complete overview of the differences while the Preparing for Cross-Platform Support section will explain how to make your applications handle these differences.

.NET Framework Software Requirements

Internet Explorer 5.01

The .NET Framework and the underlying common language runtime contain a number of elements that rely on technology delivered by some version of Internet Explorer. The ability to download code, cryptography and intra/internet zone detection are examples of such elements. Technology requirements and the fact that Microsoft Internet Explorer 5.01 reached broad deployment led to the decision to set this version as the minimum version required to install and run the .NET Framework.

Table 2 shows that Internet Explorer 5.01 must be installed on Windows 98, Windows 98 SE and Windows NT 4 before the .NET Framework can be installed. Windows ME, Windows 2000 or Windows XP operating systems already contain Internet Explorer 5.01 or higher, so no further action needs to be taken.

Table 2. Installation requirements

Requirement Platform Setup Action Default Version Internet Explorer
IE 5.01 Windows 98 Block IE 4.01
IE 5.01 Windows 98 SE Block IE 5.00
IE 5.01 Windows NT4 Block IE 4.01
IE 5.01 Windows ME n/a IE 5.50
IE 5.01 Windows 2000 n/a IE 5.01
IE 5.01 Windows XP n/a IE 6.00

Click to get Internet Explorer 6.0.

MDAC 2.6

The Microsoft® Data Access Components (MDAC) have been Microsoft's way to distribute the technology that implements the Universal Data Access Paradigm. MDAC can be downloaded and installed separately or comes with the operating system or other software like Microsoft® SQL Server™, Office XP or any other application that included the components in its setup.

In order to work, the functionality from the System.Data namespace (which is Microsoft® ADO.NET) requires MDAC 2.6 or higher to be available. The complete version number for which the runtime checks is MDAC 2.6.6526.

When installing the Framework on one of the operating systems regarded as one of the valid server operating systems for the .NET applications (any Windows 2000 version or Windows XP Professional), the setup will actually issue a warning if MDAC 2.7 or higher is not available. This is a warning that you can ignore, but not a blocking issue that will abort the installation. Figure 1 shows such a warning.

Figure 1: Setup warning

Installing the .NET Framework on any of the other operating systems (Windows 98, Windows ME and Windows NT 4.0) does not issue a warning at all when MDAC is not available, although it's also a requirement on these systems for ADO.NET to work.

So this means that the setup of the .NET Framework on Windows 2000 or Windows XP Professional checks for a different version (2.7) than the version that is required a runtime (2.6.6526).

To get MDAC go to the Universal Data Access Web site.

Other requirements

When installing the .NET Framework on Windows 2000, a warning will be issued when Internet Information Server 5 (IIS 5) is not installed and when doing the installation on Windows XP Professional, a warning is raised when IIS 5.1 is not available. On other operating systems, ASP.NET is not supported so the setup does not check for the presence of IIS.

When writing code that uses Windows Management Instrumentation (WMI) events and classes, .NET application will make use of the System.Management namespace. If WMI is not supported on the operating system, the functionality in this namespace will not work.

PlatformNotSupportedException

There are some software components that are required by some parts of the .NET Framework but that do not block the installation. If components are required at runtime but not available, the .NET Framework will throw an Exception of the type PlatformNotSupportedException that your own applications should be prepared for. More about that in the next section.

Preparing for Cross-Platform Support

Rich support across a broad array of platforms has been a design requirement since the inception of the .NET Framework. As a result, a significant amount of the value proposition offered by the .NET Framework comes from its ability to provide developers with a clear path for writing applications that work across a broad range of platforms. A .NET Framework class in general is limited only by the need for a common language runtime to exist on the underlying platform.

As always, there are exceptions to such a general statement and this article is really all about making those exceptions clear. So when designing a managed class, portability across the supported platforms should always be taken into consideration. The best way to ensure portability across the platforms supported by the .NET Framework is to build your classes using other managed code classes already available in the .NET Framework. Any time you create a .NET class that calls a native API, the risk of not supporting the breadth of officially supported platforms increases.

As the .NET Framework is a new technology, there will be cases where a new class has a legitimate need to call into Win32® or other native APIs, but this should be done with a solid understanding of trade-offs being made and how the platform support story is affected by that decision. With that thought in mind, some questions that are important to ask are:

  • •Is it really necessary to call this unmanaged API (through P/Invoke)?
  • •Is there a class in the .NET Framework that already wraps this API?
  • •If the technology needs some data about the underlying system; can it be obtained using the System.Management layer rather than calling the native APIs?
  • •If Win32-native APIs really need to be called, can those APIs be called that are supported across the platforms instead of calling the "Ex" methods that might limit the ability to work on down-level platforms?

As the OS layer underneath the .NET Framework continues to evolve with new releases, there will be cases where a .NET class needs to rely on underlying OS technology that isn't available in all of the supported operating systems. In this case, the class designer will need to weigh the cost of supporting that class across all platforms compared to the utility that the target customers will derive from having that functionality available on each of the down-level operating systems. If possible, the class should either provide the equivalent functionality on down-level platforms, or provide a subset of the functionality on those platforms. In cases where the class just won't work without a certain piece of the underlying OS, say IIS for example, the class should not install on that platform or it should check for the underlying dependency and throw a PlatformNotSupportedException when that dependency is not available.

Suppose an application trying to create a managed Socket object calls the Socket constructor on an operating system that doesn't have Winsock installed. The following exception will be thrown.

"PlatformNotSupportedException: Socket cannot be created due to a missing required platform component, Winsock 1.1"

When working with managed classes from namespaces mentioned in the appendix, it's a good idea to add code to handle the PlatformNotSupportedException.

Consider the case of an application in which you want log specific events. If this application needs to run on Windows 2000 as well as on Windows 98, you will need to consider writing events to the event log for Windows 2000 as well as to a text file for Windows 98. You can check the appendix to see on which operating systems the EventLog object from the System.Diagnostics namespace is supported. The following code shows how you can write to an event log if this is supported, or fall back on writing to an ordinary text file if it's not.

Try
   Dim objEventlog As New EventLog("Application", ".", "MyApp")
   objEventlog.WriteEntry("Application Started")
Catch ex As PlatformNotSupportedException
   ' in case of Windows 98 or Windows ME

   Dim sFile As String = "app.log"
   Dim sr As System.IO.StreamWriter

   If Not System.IO.File.Exists(sFile) Then
      sr = System.IO.File.CreateText(sFile)
   Else
      sr = System.IO.File.AppendText(sFile)
   End If

   sr.WriteLine("Application Started")
   sr.Close()

Catch ex As Exception
   MessageBox.Show("Cannot do something")
End Try

Talking it one step further

More information about the .NET Compact Framework (a version which runs on Smart Devices) can be found at the Visual Studio .NET Web site.

Appendix

Exceptions to the supported platforms

Namespace Item XP Pro XP Home 2000 NT 4 98 ME
System.Web   Y N Y N N
System.Web.Caching   Y N Y N N
System.Web.Configuration   Y N Y N N
System.Web.Security   Y N Y N N
System.Web.UI   Y N Y N N
System.Web.UI.Design   Y N Y N N
System.Web.UI.Design.WebControls   Y N Y N N
System.Web.UI.Design.Util   Y N Y N N
System.Web.UI.HTMLControls   Y N Y N N
System.Web.UI.WebControls   Y N Y N N
System.Web.Util   Y N Y N N
System.Web.Handlers   Y N Y N N
System.Web.Hosting   Y N Y N N
System.Web.SessionState   Y N Y N N
System.Web.Mail   Y N Y N N
System.EnterpriseServices   Y Y Y N N
System.Messaging Message.Transaction.Id Y Y Y N N
System.Messaging Message.Transaction.IsLastInTransaction Y Y Y N N
System.Messaging Message.Transaction.IsFirstInTransaction Y Y Y N N
System.Diagnostics Process.PriorityBoostEnabled Y Y Y Y N
System.Diagnostics Process.MinWorkingSet Y Y Y Y N
System.Diagnostics Process.MaxWorkingSet Y Y Y Y N
System.Diagnostics Process.VirtualMemorySize Y Y Y Y N
System.Diagnostics Process.UserProcessorTime Y Y Y Y N
System.Diagnostics Process.NonpagedSystemMemorySize Y Y Y Y N
System.Diagnostics Process.PrivilegedProcessorTime Y Y Y Y N
System.Diagnostics Process.PrivateMemorySize Y Y Y Y N
System.Diagnostics Process.PeakVirtualMemorySize Y Y Y Y N
System.Diagnostics Process.PeakWorkingSet Y Y Y Y N
System.Diagnostics Process.PeakPagedMemorySize Y Y Y Y N
System.Diagnostics Process.PagedSystemMemorySize Y Y Y Y N
System.Diagnostics Process.PagedMemorySize Y Y Y Y N
System.Diagnostics Process.WorkingSet Y Y Y Y N
System.Diagnostics Process.BasePriority Y Y Y Y N
System.Diagnostics Process.PowerBroadcastStatus Y Y Y Y N
System.ServiceProcess ServiceControllerStatus Y Y Y Y N
System.ServiceProcess ServiceStartMode Y Y Y Y N
System.ServiceProcess ServiceType Y Y Y Y N
System.ServiceProcess ServiceProcessInstaller Y Y Y Y N
System.ServiceProcess ServiceInstaller Y Y Y Y N
System.ServiceProcess ServiceController Y Y Y Y N
System.ServiceProcess ServiceBase Y Y Y Y N
System.IO WatcherChangeTypes Y Y Y Y N
System.IO ChangedFilters Y Y Y Y N
System.IO ErrorEventArgs Y Y Y Y N
System.IO ErrorEventHandler Y Y Y Y N
System.IO FileSystemEventArgs Y Y Y Y N
System.IO FileSystemEventHandler Y Y Y Y N
System.IO FileSystemWatcher Y Y Y Y N
System.IO InternalBufferOverflowException Y Y Y Y N
System.IO IODescriptionAttribute Y Y Y Y N
System.IO RenamedEventArgs Y Y Y Y N
System.IO RenamedEventHandler Y Y Y Y N
System.IO WaitForChangedResult Y Y Y Y N
System.IO NotifyFilters Y Y Y Y N
System.Diagnostics CounterCreationDataCollection Y Y Y Y N
System.Diagnostics CounterCreationData Y Y Y Y N
System.Diagnostics CounterSample Y Y Y Y N
System.Diagnostics CounterSampleCalculator Y Y Y Y N
System.Diagnostics EntryWrittenEventArgs Y Y Y Y N
System.Diagnostics EntryWrittenEventHandler Y Y Y Y N
System.Diagnostics EventLog Y Y Y Y N
System.Diagnostics EventLogEntry Y Y Y Y N
System.Diagnostics EventLogEntryCollection Y Y Y Y N
System.Diagnostics EventLogEntryType Y Y Y Y N
System.Diagnostics EventLogInstaller Y Y Y Y N
System.Diagnostics InstanceData Y Y Y Y N
System.Diagnostics InstanceDataCollection Y Y Y Y N
System.Diagnostics InstanceDataCollectionCollection Y Y Y Y N
System.Diagnostics PerformanceCounter Y Y Y Y N
System.Diagnostics PerformanceCounterCategory Y Y Y Y N
System.Diagnostics PerformanceCounterInstaller Y Y Y Y N
System.Diagnostics PerformanceCounerManager Y Y Y Y N
System.Diagnostics PerformanceCounterType Y Y Y Y N
System.Diagnostics EventLogTraceListener Y Y Y Y N
System.Environment WorkingSet Y Y Y Y N
System.Threading ThreadPool.BindHandle Y Y Y Y N
System.Threading Overlapped.Pack Y Y Y Y N
System.Threading Overlapped.Unpack Y Y Y Y N
System.Threading Overlapped.UnsafePack Y Y Y Y N
System.Diagnostics Process.PeakVirtualMemorySize Y Y Y Y N
System.Diagnostics Process.NonpagedSystemMemorySize Y Y Y Y N
System.Diagnostics Process.PriorityBoostEnabled Y Y Y Y N
System.Diagnostics Process.WorkingSet Y Y Y Y N
System.Diagnostics Process.MaxWorkingSet Y Y Y Y N
System.Diagnostics Process.PrivilegedProcessorTime Y Y Y Y N
System.Diagnostics Process.MinWorkingSet Y Y Y Y N
System.Diagnostics Process.StartTime Y Y Y Y N
System.Diagnostics Process.PrivateMemorySize Y Y Y Y N
System.Diagnostics Process.PagedSystemMemorySize Y Y Y Y N
System.Diagnostics Process.PeakWorkingSet Y Y Y Y N
System.Diagnostics Process.UserProcessorTime Y Y Y Y N
System.Diagnostics Process.PagedMemorySize Y Y Y Y N
System.Diagnostics Process.PeakPagedMemorySize Y Y Y Y N
System.Diagnostics Process.VirtualMemorySize Y Y Y Y N
System.Diagnostics Process.TotalProcessorTime Y Y Y Y N
System.Diagnostics Process.ExitTime Y Y Y Y N
System.EnterpriseServices ApplicationActivationAttribute.SoapVRoot Y Y N N N
System.EnterpriseServices ApplicationQueuingAttribute.MaxListenerThreads Y Y N N N
System.EnterpriseServices ContextUtil.ApplicationId Y Y N N N
System.EnterpriseServices ContextUtil.ApplicationInstanceId Y Y N N N
System.EnterpriseServices PrivateComponentAttribute Y Y N N N
System.EnterpriseServices TransactionAttribute.Timeout Y Y N N N
System.EnterpriseServices TransactionIsolationLevel Y Y N N N
System.EnterpriseServices Namespace overview Y Y Y N N
System.EnterpriseServices AccessChecksLevelOption Y Y Y N N
System.EnterpriseServices ActivationOption Y Y Y N N
System.EnterpriseServices ApplicationAccessControlAttribute Y Y Y N N
System.EnterpriseServices ApplicationActivationAttribute Y Y Y N N
System.EnterpriseServices ApplicationIDAttribute Y Y Y N N
System.EnterpriseServices ApplicationNameAttribute Y Y Y N N
System.EnterpriseServices ApplicationQueuingAttribute Y Y Y N N
System.EnterpriseServices AuthenticationOption Y Y Y N N
System.EnterpriseServices AutoCompleteAttribute Y Y Y N N
System.EnterpriseServices BOID Y Y Y N N
System.EnterpriseServices BYOT Y Y Y N N
System.EnterpriseServices ComponentAccessControlAttribute Y Y Y N N
System.EnterpriseServices COMTIIntrinsicsAttribute Y Y Y N N
System.EnterpriseServices ConstructionEnabledAttribute Y Y Y N N
System.EnterpriseServices ContextUtil Y Y Y N N
System.EnterpriseServices DescriptionAttribute Y Y Y N N
System.EnterpriseServices EventClassAttribute Y Y Y N N
System.EnterpriseServices EventTrackingEnabledAttribute Y Y Y N N
System.EnterpriseServices ExceptionClassAttribute Y Y Y N N
System.EnterpriseServices IISIntrinsicsAttribute Y Y Y N N
System.EnterpriseServices ImpersonationLevelOption Y Y Y N N
System.EnterpriseServices InstallationFlags Y Y Y N N
System.EnterpriseServices InterfaceQueuingAttribute Y Y Y N N
System.EnterpriseServices IRegistrationHelper Y Y Y N N
System.EnterpriseServices IRemoteDispatch Y Y Y N N
System.EnterpriseServices ITransaction Y Y Y N N
System.EnterpriseServices JustInTimeActivationAttribute Y Y Y N N
System.EnterpriseServices LoadBalancingSupportedAttribute Y Y Y N N
System.EnterpriseServices MustRunInClientContextAttribute Y Y Y N N
System.EnterpriseServices ObjectPoolingAttribute Y Y Y N N
System.EnterpriseServices PrivateComponentAttribute Y Y N N N
System.EnterpriseServices PropertyLockMode Y Y Y N N
System.EnterpriseServices PropertyReleaseMode Y Y Y N N
System.EnterpriseServices RegistrationErrorInfo Y Y Y N N
System.EnterpriseServices RegistrationException Y Y Y N N
System.EnterpriseServices RegistrationHelper Y Y Y N N
System.EnterpriseServices RegistrationHelperTx Y Y Y N N
System.EnterpriseServices ResourcePool Y Y Y N N
System.EnterpriseServices SecureMethodAttribute Y Y Y N N
System.EnterpriseServices SecurityCallContext Y Y Y N N
System.EnterpriseServices SecurityCallers Y Y Y N N
System.EnterpriseServices SecurityIdentity Y Y Y N N
System.EnterpriseServices SecurityRoleAttribute Y Y Y N N
System.EnterpriseServices ServicedComponent Y Y Y N N
System.EnterpriseServices ServicedComponentException Y Y Y N N
System.EnterpriseServices SharedProperty Y Y Y N N
System.EnterpriseServices SharedPropertyGroup Y Y Y N N
System.EnterpriseServices SharedPropertyGroupManager Y Y Y N N
System.EnterpriseServices SynchronizationAttribute Y Y Y N N
System.EnterpriseServices SynchronizationOption Y Y Y N N
System.EnterpriseServices TransactionAttribute Y Y Y N N
System.EnterpriseServices TransactionIsolationLevel Y Y N N N
System.EnterpriseServices TransactionOption Y Y Y N N
System.EnterpriseServices TransactionVote Y Y Y N N
System.EnterpriseServices XACTTRANSINFO Y Y Y N N
System.EnterpriseServices ContextUtil.PartitionId Y Y N N N
System.EnterpriseServices TransactionAttribute.
Isolation
Y Y N N N
System.EnterpriseServices.
CompensatingResourceManager
ApplicationCrmEnabledAttribute Y Y Y N N
System.EnterpriseServices.
CompensatingResourceManager
Clerk Y Y Y N N
System.EnterpriseServices.
CompensatingResourceManager
ClerkInfo Y Y Y N N
System.EnterpriseServices.
CompensatingResourceManager
ClerkMonitor Y Y Y N N
System.EnterpriseServices.
CompensatingResourceManager
Compensator Y Y Y N N
System.EnterpriseServices.
CompensatingResourceManager
CompensatorOptions Y Y Y N N
System.EnterpriseServices.
CompensatingResourceManager
LogRecord Y Y Y N N
System.EnterpriseServices.
CompensatingResourceManager
LogRecordFlags Y Y Y N N
System.EnterpriseServices.
CompensatingResourceManager
TransactionState Y Y Y N N