Blank Dialogs for .NET Framework 2.0 Patches

Heath Stewart

When you download a patch for .NET Framework 2.0 and double-click to install it, you'll find that the dialog is missing some text as in the example below.

.NET Framework 2.0 Patch UI

This is due, in part, to a bug in Windows Installer when the ProductLanguage property is 0 in the Property table.

Windows Installer contains localized string tables for some basic text like for the Cancel button, and some errors that may be returned if the package can't be opened, a patch cannot be uninstalled, and other issues mainly before a package can even be loaded. Until the package is loaded and the ProductLanguage property is read, Windows Installer uses the user's default user interface language; after that, language resources are used according to the ProductLanguage property value. Localized strings are expected to be found in the ActionText table and the Error table, which includes strings such as Error 20, typically read in English as "Please wait while Windows configures [ProductName]", which should be displayed in the dialog above.

In Windows Installer 3.1 and prior, when ProductLanguage is 0 Windows Installer does not pick the right strings in another resource – a binary resource – nor does it even contain a lot of strings commonly found in the Error table. This is now fixed in Windows Installer 4.0 for Windows Vista.

Since the right common Error strings were not properly selected, the setup build team did not merge resources into the ActionText and Error tables. It was decided that displaying no text is better than displaying only English text. Before being released, this was also the case for Visual Studio 2005 but since VS was language-specific we made sure they merged the correct ActionText and Error table strings into the .msi file. To display localized strings in popup dialogs for language-neutral products where ProductLanguage = 0, we do embed "resource merge modules". These are .msm files that contain localized resources such as error strings and dialogs. When necessary, we extract a .msm file according to the user's default user interface language and extract what strings or dialogs we need. We cannot, unfortunately, use that approach to provide strings used in the basic UI you see above.

The wrapper that ships with the .NET Framework 2.0 redistributable is an external UI handler that does not, unfortunately, use localized transforms but instead processes messages from Windows Installer and displays localized text based on those messages. Since transforms are not used, no transforms are cached along with the product package so the patch UI will not contain text for some controls.

To fix this you can create a transform that will add localized strings to the ActionText and Error tables. You can do this in Orca, for example, following the instructions below.

  1. Extract the .NET Framework 2.0 .msi file from the redistributable package:

    dotnetfx.exe /c /t:"%CD%dotnetfx"

  2. Open netfx.msi in Orca
  3. Select the Error table
  4. Shift + Click to select errors 0 through 1903, and press Delete, confirming deletion
  5. Click the Transform menu and select New Transform
  6. Click the Tables menu and select Import Tables…
  7. Browse to the SamplesSysMgmtMsidatabaseINTL sub-directory of the Platform SDK
  8. Change the file filter to "All Files (*.*)"
  9. Ctrl + Click to select ActionTe.ENU and Error.ENU (or any supported corresponding files for other languages, using the three-letter language abbreviation as the file extension)
  10. Click Open
  11. Click OK
  12. Click the Transform menu and select Transform Properties…
  13. Check Add Existing Row
  14. Click OK
  15. Click the Transform menu and select Generate Transform…
  16. Save the .mst file

I have created transforms for all languages contained in the Windows Installer SDK, along with strings.txt that describes what language – in both native and English names – each file contains.

When installing the redistributable, your bootstrap application will have to pick the correct UI transform however is necessary. You can then install the .NET Framework 2.0 redistributable with the following command.

dotnetfx.exe /c:"msiexec.exe /i netfx.msi /l*v install.log USING_EXUIH=1 TRANSFORMS=pathstrings.enu.mst

Substitute path with the path to the transform you want to use, and of course substitute "enu" with the three-letter Windows language code you want to use during translation. Do be aware that this is the language that will be used when installing future patches since the transform is cached along with the product package. You cannot, unfortunately, transform a package when installing a patch; it must be done during the initial installation.

This approach is not officially supported by Microsoft, so please use caution. Future patches along with newer Windows Installer runtimes may resolve the localization problems discussed above, and using localized transforms in this manner may cause any solution to not work correctly based on the user's default user interface language. If you need to redistribute the .NET Framework 2.0 runtime, you might consider doing so silently with a basic "Please wait" sort of dialog or simply requiring that users first install the .NET Framework 2.0 from Windows Update, Microsoft Update, or some other distribution media. If you simply require a patch and the .NET Framework 2.0 is already installed, you must either install the patch silently or bear the empty dialog as you see above.


Discussion is closed.

Feedback usabilla icon