Community Forums
Results 1 to 3 of 3

Thread: Managed Code Custom Action Failing

  1. #1
    Join Date
    Feb 2015

    Managed Code Custom Action Failing

    We are trying to use a managed code custom action using a default method signature to call a .dll file at the beginning of the UI sequence, but every time it runs it returns a value of 3, and provides no further information. Has anyone ever done this successfully?

  2. #2
    Join Date
    Aug 2005
    Sure, I've made this work. Sounds like something is not set up quite right is all.

    My recommendations:

    1. Add a Debugger.Launch() call at the start of the method. If it's not hit, it's likely an assembly load error.
    2. Before taking further action, check to see if maybe you've got references that the *.dll needs as local reference (they aren't included automatically by InstallShield).
    3. If you don't have a dependency issue, debug the assembly load log.
    4. Sanity check: Make sure your method is declared as Public Static.
    Cary R.
    Configuration Engineer

  3. #3
    Join Date
    Nov 2016
    I've gotten this to work in my Suite Managed Code CA sure it's the same in an MSI CA. I add the dll in the Support Files and add the following parameters for my custom action, I have multiple custom actions referencing different functions in my dll:

    New Managed Code CA:
    File: [SETUPSUPPORTDIR]InstallCheck.dll
    Class: InstallCheck.PreInstallCheck
    Method: SetDefaults

    This is a small sample of how I'm using it:

    using System;
    using System.IO;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Data.SqlClient;
    using System.Management;
    using Microsoft.Win32;
    using System.Windows.Forms;
    using System.Diagnostics;
    using System.ServiceProcess;
    using System.Drawing;
    using System.Text.RegularExpressions;
    using System.Data;
    using Microsoft.Web.Administration;
    namespace InstallCheck
        public interface ISuiteExtension
            string get_Attribute(string bstrName);
            void LogInfo(string bstr);
            string get_Property(string bstrName);
            void set_Property(string bstrName, string bstrValue);
            string FormatProperty(string bstrValue);
            string ResolveString(string bstrStringId);
        public class PreInstallCheck
            const UInt32 ERROR_INSTALL_FAILURE = 1603;
            const UInt32 ERROR_SUCCESS = 0;
            ISuiteExtension GetExtensionFromDispatch(object pDispatch)
                if (Marshal.IsComObject(pDispatch) == false)
                    throw new System.ContextMarshalException("Invalid dispatch object passed to CLR method");
                return (ISuiteExtension)pDispatch;
            public void SetDefaults(object pDispatch)
                ISuiteExtension suiteExtension = GetExtensionFromDispatch(pDispatch);
                    string myProperty = suiteExtension.get_Property("AnyExistingProperty");
                catch (Exception e)
            // To have installer see the error
            public UInt32 SetCheckBox(object pDispatch)
                ISuiteExtension suiteExtension = GetExtensionFromDispatch(pDispatch);
                string PROPERTY = suiteExtension.get_Property("PROPERTY");
                if (PROPERTY = "good")
    	      return ERROR_SUCCESS;
                  return ERROR_INSTALL_FAILURE;
    Hope this helps.
    Last edited by tmurnane; 03-02-2018 at 01:04 PM.

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts