ActiveX控件只是实现了IUnknown接口的COM对象。最近的IE版本还要求该对象实现IObjectSafety接口。为了实现有用的功能,该对象还需要实现一些其他的Ole接口,如IDispatch、IOleObject等。该对象需要通过CoCreateInstance()创建,这意味着您必须以某种方式将其注册到注册表中。您不必在标记中使用GUID,也可以使用AppId(如果注册了一个)。
你还可以编写一些托管代码,并在IE中运行。这是通过CLR在安装时注册
MIME过滤器实现的。然后,当IE看到您发送了正确的MIME类型的内容时,它会将代码交给CLR处理。CLR确实会对代码进行沙箱处理,只授予Internet权限,因此它不能执行框架提供的所有操作。您需要查看特定文档以了解此安全区域中可以和不可以做什么。
一些权衡:
安装便捷性:ActiveX控件要求您将所有内容打包成一个.CAB文件,并使用相当难懂的.INI文件描述安装要求。如果您必须与模块一起安装其他依赖项(例如ATL / MFC dll或其他第三方模块),则会变得非常棘手。对于.NET模块,您只需以正确的MIME类型发送它即可,但您必须确保用户拥有正确版本的框架(您可以通过网站上的用户代理字符串进行检查)。
安全性:ActiveX控件只是在用户系统上运行的本机代码,因此理论上它们可以做任何想做的事情。在实践中,LoRIE在许多情况下都进行了限制,您必须对诸如注册表和文件系统访问等事物进行大量特殊处理(请参见理解和使用受保护模式)。
线程:由于ActiveX控件在浏览器UI线程上运行,因此必须确保不要在该线程上执行长时间阻塞操作,因此必须自己处理线程。如果您的长时间阻塞操作操纵DOM,则必须自己编排IHTMLxxx接口,可以使用GIT或COM编排函数。我不确定.NET小程序是否在浏览器UI线程上运行,但我确定在C#中更容易处理。
浏览器对象:如果您想在托管扩展中使用IE / Shell对象,则大多数情况下必须自己编写interop,因为框架没有很好地将这些接口封装在托管对象中。请参见http://pinvoke.net以获得一些帮助。
兼容性:在同一进程中托管不同版本的运行时存在问题。直到最近,这根本不可能,但我认为随着3.x版本的推出,这已经开始变得可能了。总之,如果您针对.net 2.0,而其他人已经加载了.net 1.0作为其浏览器扩展的一部分,那么您将失去机会。一般来说,IE和Windows Shell不支持托管扩展。这个.net应用程序MIME过滤器可能是一个值得注意的例外,但请注意可能存在潜在问题。