With .NET 4.0, writing reliable managed extensions for Internet Explorer has become possible. Unlike previous versions, each extension will run against the CLR it was compiled for instead of mindlessly grabbing the most recent version.
In the past writing managed extensions for Internet Explorer was considered taboo. While technically you could do it, processes could only load one version of .NET at a time. This means a given extension could have unexpected behavior caused by a newer CLR or even fail to load if an older CLR was already running. With .NET 4.0, “COM Visible types are guaranteed to run against the CLR they were compiled with.”
Kevin Jones has started a series on writing managed extensions for Internet Explorer. He starts with registering the component in IObjectWithSite and then grabbing the IWebBrowser2 and IWebBrowser2 objects. As the IE extension model is still entirely COM based, you will have to work with registry settings and rather hairy-looking interfaces.