void Bind <T>(Expression <Func <T> > expression, When when = When.Before, Step step = null, bool elevated = false) { var name = Reflect.NameOf(expression); var handler = expression.Compile()() as Delegate; const string wixSharpProperties = "WIXSHARP_RUNTIME_DATA"; if (handler != null) { if (this.AbortSetupOnUnhandledExceptions.HasValue) { var abortOnErrorName = "WIXSHARP_ABORT_ON_ERROR"; if (!Properties.Any(p => p.Name == abortOnErrorName)) { this.AddProperty(new Property(abortOnErrorName, this.AbortSetupOnUnhandledExceptions.Value.ToString())); } } //foreach (string handlerAsm in handler.GetInvocationList().Select(x => x.Method.DeclaringType.Assembly.Location)) foreach (var type in handler.GetInvocationList().Select(x => x.Method.DeclaringType)) { string location = type.Assembly.Location; //Resolving scriptAsmLocation is not properly tested yet bool resolveInMemAsms = true; if (resolveInMemAsms) { if (location.IsEmpty()) { location = type.Assembly.GetLocation(); } } if (location.IsEmpty()) { throw new ApplicationException($"The location of the assembly for ManagedProject event handler ({type}) cannot be obtained.\n" + "The assembly must be a file based one but it looks like it was loaded from memory.\n" + "If you are using CS-Script to build MSI ensure it has 'InMemoryAssembly' set to false."); } if (!this.DefaultRefAssemblies.Contains(location)) { this.DefaultRefAssemblies.Add(location); } } this.AddProperty(new Property("WixSharp_{0}_Handlers".FormatWith(name), GetHandlersInfo(handler as MulticastDelegate))); string dllEntry = "WixSharp_{0}_Action".FormatWith(name); if (step != null) { if (elevated) { this.AddAction(new ElevatedManagedAction(dllEntry) { Id = new Id(dllEntry), ActionAssembly = thisAsm, Return = Return.check, When = when, Step = step, Condition = Condition.Create("1"), UsesProperties = "WixSharp_{0}_Handlers,{1},{2}".FormatWith(name, wixSharpProperties, DefaultDeferredProperties), }); } else { this.AddAction(new ManagedAction(dllEntry) { Id = new Id(dllEntry), ActionAssembly = thisAsm, Return = Return.check, When = when, Step = step, Condition = Condition.Create("1") }); } } } }