最近帮同事找c#开发activex控件自动升级的方法,得到的一些细节。这些细节其实稍微动点脑子都能想出来的。
ie检测到本机控件的版本比html中codebase中版本低,就会下载codebase中指定的cab来安装。这个过程不管cab里面是什么东西,哪怕里面的版本更低,或者是其他的activex,顺便说下,关于下载跟cab内容无关,我跟某人说了几次,结果都左耳进右耳出。
ie检测本机控件版本的方法是,先读取控件信息(HKEY_CLASSES_ROOT\CLSID\html中指定的clsid\)中InstalledVersion项的默认值,这个值就是本机控件的版本号。如果不存在InstalledVersion项,则读InprocServer32项下默认值对应文件的版本号。
如果懂一点com原理的话,都应该知道InprocServer32项下默认值就是控件对应的文件。该文件中的DllGetClassObject函数是用来创建控件的。而C#开发的控件文件,里面没有导出任何函数,严格的说C#开发的控件并不是真正的com控件,它必须借助net的mscoree.dll来实现com的流程。
所以所有c#开发的控件InprocServer32项下默认值都是mscoree.dll。对于c#开发的控件,如果没有InstalledVersion项,检测本机控件版本的时候都是读的net系统文件mscoree.dll的文件版本。c#开发的控件要实现自动升级就必须写注册表的InstalledVersion项。
另外,补一句日志中的c#开发的控件应该改成.net开发的控件。