I just finished a bunch of work on the ClickOnce documents regarding Platform Detection, which ClickOnce uses to check that the operating system and installed CLR are of the appropriate version, and also that any controls required to be installed in the GAC are installed. If ClickOnce detects that one of these prereqs is missing or doesn't match what the ClickOnce application manifest requires, it halts installation and displays a failure dialog to the user.

An undocumented feature - undocumented until now! - is that this failure dialog can contain a support URL, pointing to a page with more information about how to resolve the failure. E.g., a dependency on a GAC-installed component can point to a page that contains a link to an MSI that installs it. (You can also bootstrap the component, of course, but this option might be more appealing if you're certain most customers already have the prereq installed. This avoids another MSI setup launching prior to install.)

You have to hack this in to the application manifest by hand, and then re-sign the application and deployment manifests. Also, the URL will not display unless your app has full trust.

I have a How to about this that will be published later this year. For now, here are the relevant application manifests snippets that show the supportUrl.

OS Dependency:

 <dependency>

    <dependentOS

supportUrl="http://www.adatum.com/MyApplication/wrongOSFound.htm">

      <osVersionInfo>

        <os majorVersion="4" minorVersion="0" servicePackMajor="0" servicePackMinor="0" />

      </osVersionInfo>

    </dependentOS>

  </dependency>

CLR minimum required version:

<dependency>

    <dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true" supportUrl=" http://www.adatum.com/MyApplication/wrongClrVersionFound.htm">

      <assemblyIdentity name="Microsoft.Windows.CommonLanguageRuntime" version="2.0.40607.0" />

    </dependentAssembly>

  </dependency>

GAC dependency:

  <dependency>

    <dependentAssembly dependencyType="preRequisite" allowDelayedBinding="true" supportUrl=" http://www.adatum.com/MyApplication/missingSampleGACAssembly.htm">

      <assemblyIdentity name="SampleGACAssembly" version="5.0.0.0" publicKeyToken="04529dfb5da245c5" processorArchitecture="msil" language="neutral" />

    </dependentAssembly>

  </dependency>