views:

1997

answers:

4

Hello,

I'm creating a installer for a c# windows project using VS 2008. I'm trying to write a custom action that copies a settings file from the source directory of the MSI file stored on a file server (e.g. \server\fileshare\myappinstaller\mysetting.xml) to the target directory on the computer on which my application is been installed (e.g. C:\Program Files\My App).

The settings file can't be added in to the installer as it will contain settings with will be unique to the customer installing the app.

Does anyone have code (preferably C# or VB.NET) for such a custom action? Alternately does anyone know how to get the MSI source location (e.g. \server\fileshare\myappinstaller) within a custom action.

Many thanks

+1  A: 

I would recommend you to add the XML file to the installer as one of the components to be installed. That would be the easiest way and would not require a custom action.

WiX might be an option for you. It allows you to customize XML configuration files during installation using XmlConfig.

0xA3
A: 

Normally custom actions in WindowsInstaller use something from the tables of the msi to put something into any table of the msi.

Additionally the WindowsInstaller-Team declines any managed extensions for the installers, reasons for that are found everywhere on the net.

But, I did some time ago figure out an extension to create managed custom actions for WindowsInstallers, usable with WiX, that works still, but there is a newer solution on top of that work, a real extension for WiX to allow managed custom actions.

BeowulfOF
+1  A: 

I do a similar thing, but ship a default configuration inside the MSI file and then use a MST to add the custom configuration file. It's much more reliable as everything is "native" to windows installer and I just need to send out a small custom MST to each customer.

More information on how I'm doing this can be found over at http://stackoverflow.com/questions/319894/simplest-solution-to-replace-a-tiny-file-inside-an-msi

sascha
A: 

I have solved this by adding

/InstallerPath="[OriginalDatabase]"

to the CustomActionData of the Custom Action (in the Tab Custom Actions of the Setup Project) and reading the value with this code in the Custom Action:

    Public Overrides Sub Commit(ByVal savedState As System.Collections.IDictionary)
        MyBase.Commit(savedState)

        Dim directoryOfMSI As String = IO.Path.GetDirectoryName(Context.Parameters("InstallerPath"))

        'Do your work here
        '...

    End Sub

Ciao! Stefan

habakuk