Call me what you like but I love InnoSetup. Its simplicity and ease-of-use are unparalleled. However, using it to distribute .NET apps is not straightforward as you also need to include the .NET Framework if you’re targeting older versions of Windows. The situation is exacerbated by Microsoft’s insistence on using the Windows Installer technology to distribute .NET apps. I find Windows Installer to be quite ambiguous for end-users, especially when distributing smaller apps.
So, I went off writing a function for InnoSetup that checks if the appropriate version of the .NET Framework is installed. If it isn’t, it will automatically download and install the required version from Microsoft’s own servers.