OK, so you've spent ages making a little Browser Helper Object (BHO) for Internet Explorer, and you've tested it on many other machines by registering it using regasm like so:
regasm /codebase your.dll
So then you decide the time's right to bundle your code into an installer for mass consumption. You now spend then next week trying to work out how to get your dll registered on the target machine before you go nuts or rip too much of your hair out. Welcome to my world.
I followed countless articles on the web which informed me of the basic pitfalls when trying to register a .NET dll on the target machine using a Visual Studio setup project. These included:
Still nothing. Nowt.
So in the end I got fed up and just created a custom action which will locate regasm in the latest version of the .NET framework that is installed on the target machine and run it against the newly installed dll. Hurrah! It works perfectly!
Realising that I couldn't be the only person who's having this problem, I've decided to share the code to assist others. All you need to do is follow the below steps:
You should now have an installer that registers your dll using regasm /codebase.
clsRegisterDll.cs:
using System.ComponentModel;
using System.Configuration.Install;
namespace YourNamespace
{
[RunInstaller(true)]
public partial class RegisterDll : Installer
{
public RegisterDll()
{
InitializeComponent();
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Commit(System.Collections.IDictionary savedState)
{
base.Commit(savedState);
// Get the location of regasm
string regasmPath = System.Runtime.InteropServices.RuntimeEnvironment.GetRuntimeDirectory() + @"regasm.exe";
// Get the location of our DLL
string componentPath = typeof(RegisterDll).Assembly.Location;
// Execute regasm
System.Diagnostics.Process.Start(regasmPath, "/codebase \"" + componentPath + "\"");
}
[System.Security.Permissions.SecurityPermission(System.Security.Permissions.SecurityAction.Demand)]
public override void Install(System.Collections.IDictionary stateSaver)
{
base.Install(stateSaver);
}
}
}
© Leon Mayne 2007