<p>How can I call a custom action dll written in managed code (.net) from an installer without using an unmanaged intermediary?</p>

There is support for exactly this in .NET/Windows Installer
Create an assembly using VS.NET.
Add an installer class to the project - select 'Add - New Item'. Select intaller class.
This class derives from System.Configuration.Install.Installer. It has a number of virtual methods such as Install(). This will be called when by the windows installer engine at install time.
This assembly can then be added to your Windows Installer project as a custom action. The method used to declare the custom action as a .NET installer class depends on the tool you are using to create the installation.
Sorry this is a little brief.