Wrong session.Property's value in ElevatedManagedAction

Oct 4, 2016 at 12:15 PM
Hello, Oleg!
I set up new property "DATABASE_CONNECTION_STRING". In ElevatedManagedAction it's value is wrong.

var project = new ManagedProject("My product", dir,
        new Property("DATABASE_CONNECTION_STRING", @"Data Source=.\SQLEXPRESS;Initial Catalog=DistributeSystem; Integrated Security=SSPI"),
        new ElevatedManagedAction(CustomActions.SaveSettings, Return.check,
                When.After, Step.InstallFiles, Condition.NOT_Installed)
                {
                    UsesProperties = "DATABASE_CONNECTION_STRING, INSTALLDIR, ProductName",
                    Execute = WixSharp.Execute.deferred
                });
project.BeforeInstall += project_BeforeInstall;

...

[CustomAction]
public static ActionResult SaveSettings(Session session)
{
try
{
    MessageBox.Show(session.Property("DATABASE_CONNECTION_STRING"));
}
catch { }
return ActionResult.Success;
}

in BeforeInstall event handler e.Session.Property("DATABASE_CONNECTION_STRING") is right: @"Data Source=.\SQLEXPRESS;Initial Catalog=DistributeSystem; Integrated Security=SSPI"

in SaveSettings function session.Property("DATABASE_CONNECTION_STRING") is @"Data Source=.\SQLEXPRESS"
Coordinator
Oct 5, 2016 at 3:18 AM
Wix# doesn't participate in serializing/deserializing CustomActionData content. It is completely done by WiX runtime. I guess when it does this it doesn't escape the comas, which are the value delimiters and must be escaped.

Ironically 5 years ago it was the same bug reported but at that time they used semi-clumns instead of comas: http://windows-installer-xml-wix-toolset.687559.n2.nabble.com/Bug-with-Semi-colon-in-Custom-action-data-td7004749.html. Meaning that the serialization flaw is still there.

You can fix it by just replacing "," with ";" if SQLServer allows ";". But better yet just do proper escaping:
new Property(
    "DATABASE_CONNECTION_STRING", 
   @"Data Source=.\SQLEXPRESS;Initial Catalog=DistributeSystem; Integrated Security=SSPI".Replace(";", "{sep}")),
...
MessageBox.Show(session.Property("DATABASE_CONNECTION_STRING").Replace("{sep}", ";"));