.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 |