[wix-users] .NET 7 NativeAOT Custom Actions appear to work

Christopher Painter chrpai at iswix.com
Tue Nov 15 07:55:33 PST 2022

This is one of the most interesting and exciting posts that I've seen in a long time.   About 15 years ago I did a deep dive into Managed C++ and other techniques and then DTF came around.

What this is telling me is that Heatwave needs another project type.   C# NativeAOT Custom Action.  If Heatwave doesn't want to do it, I'll put it in IsWiX.

From: wix-users <wix-users-bounces at lists.wixtoolset.org> on behalf of Edwin Young via wix-users <wix-users at lists.wixtoolset.org>
Sent: Tuesday, November 15, 2022 12:45 AM
To: wix-users at lists.wixtoolset.org <wix-users at lists.wixtoolset.org>
Cc: Edwin Young <the.edwin.young at gmail.com>
Subject: [wix-users] .NET 7 NativeAOT Custom Actions appear to work


I've long found it a bit frustrating to write custom actions - writing
HRESULT-style C++ makes me sad, and managed custom actions, despite the
awesome work the Wix team has put in, have some drawbacks, like the
dependency on having a compatible framework installed.

So I was quite excited to see that .NET 7 has the ability to output DLLs
which have no dependencies and can be called from unmanaged code :-)
See samples/core/nativeaot/NativeLibrary
at main · dotnet/samples · GitHub

I wanted to see if this would work for Custom Actions, and according to my
very first experiment, the answer appears to be yes!

edyoung/net7ca: Experiment to see if I can write Custom Actions in .NET 7
(github.com) <https://github.com/edyoung/net7ca>

I can write a custom action in C#:

using System.Runtime.InteropServices;
using WixToolset.Dtf.WindowsInstaller;

namespace CustomAction;
public class Class1
    [UnmanagedCallersOnly(EntryPoint = "CustomAction2")]
    public static uint CustomAction2(IntPtr handle)
        using Session session = Session.FromHandle(handle, false);

        session.Log("Custom Action 2 Called");
        return 0;

Compile it with .NET 7, publish it, and call it from an installer. The log
message appears in the MSI log!

The binary DLL which is output contains all the bits of the CLR which are
required, which turns out to be about 3MB - painfully large, but not
impossible if you have a largish install package.

So obviously, this is a very long way from a production solution - there
are likely all sorts of problems ahead - but I'm quite excited about the
possibilities, so I wanted to share.

Also, Wix4 worked beautifully first time for this experiment. Thanks Rob &

Happy installing!

WiX Toolset Users Mailing List provided by FireGiant http://www.firegiant.com/

More information about the wix-users mailing list