views:

393

answers:

2

My company currently builds separate MSI's for all of our clients, even though the app is 100% the same across the board (with a single exception, an ID in the app.config).

I would like to show them that we can publish in once place with ClickOnce, and simply add a query string parameter for each client's installer.

Example: http://mysite.com/setup.exe?ID=1234-56-7890

The issue that I'm having is that the above ("ID=1234...") is not being passed along to the "myapplication.application". What is happening instead is, the app is being installed successfully, and it is running the first time with an activation context, but the "ActivationUri" does not contain any query string values.

Is there a way to pass query string values FROM THE INSTALLER URL to the application's launch URL? If so, how?

A: 

For me, "http://mysite.com/myapplication.application?id=1234-56-7890" seems to do the trick.

Brother Erryn
It's true that the URL will be sent to the application, but not to the installer.
Timothy Khouri
A: 

After much searching (and discussing), the answer is simply that the current version of ClickOnce doesn't work that way. The installer does not pass the URL onto the application up it's first run.

Here is what I have done for a workaround (and it works great).

  • Change my setup package to have all of the required files uncompressed and loose (as apposed to using a CAB file, or embedding them in the installer).

  • Make an ASP.NET application (using Routing for URL handling) that listens for a request to "mysite.com/Installer/00123/Setup.exe"

    • Note: the route should listen for "/Installer/{ID}/*" where {ID} is 5 digits.
    • There is actually no directory called "00123", but rather, I'm using ASP.NET Routing to pickup those requests and then I map it to my actual directory that has the installer file in it.
  • I then hijack the request (parse the setup.exe to find the embedded URL that tells the installer program where to find the rest of the files... I then replace "/00000/" with the request URL that the user went to - in this case "00123".

    • As each file is being requested, I know which "version" of the file to send, because the ClickOnce Installer will be looking for "mysite.com/Installer/00123/SomeFile.dll" (or whatever).

Instead of using a 5-digit ID, you could use a GUID... it's up to you.

This solution works great for our organization... we currently have 37 clients who require unique customizations to their installer package, but we only have to actually build and publish ONE installer package and simply use the hijack method above.

At this point we have placeholders that we swap out so that it's easy to customize installers for as many clients as we want.

Example: in the app.config file we have displayName="{OrgName}" which is automatically replaced by one of the values in the database.

Timothy Khouri