在CAB中部署C#ActiveX以供Internet Explorer使用

wpf*_*abe 13 c# internet-explorer activex cab

我正在拼命尝试将用于在C#中开发的IE的ActiveX部署为CAB存档.我已经阅读了很多资源(其中一些来自StackOverflow),看起来很多人都遇到了同样的问题.我尝试了3个解决方案:a)创建CAB VS项目,b)使用CABARCINF中的COM注册手动创建CAB,c)手动创建带启动的CAB msiexec.他们都没有工作.我甚至试过d)创建一个启动msiexec无效的引导程序(因为有些人建议只msiexec在Vista上启动无法工作).

我正在运行Windows Vista但我的项目甚至无法在XP上的IE6上运行.

当我使用MSI安装ActiveX时,所有Windows都可以.显然CAB的东西不起作用,我找不到调试整个过程的正确方法.

任何帮助表示赞赏.

RB.*_*RB. 29

更新:请注意,这个古老而优秀的答案仍然是如何解决这个问题的一个非常好的大纲,至少与Win7和IE11的演化规模一样.我只是使用Answerer的Firebreath.org工具集作为跳跃点成功完成所有工作.这不简单,但可以做到.我已将该项目的引用添加到下面的参考列表中,因为它可能为当前开发人员提供比此概述更合理的跳转点.


万岁 - 我刚刚完成了一个相同的项目,所以你会很高兴知道这实际上是可能的.我只在XP上测试了这个 - 我知道可能存在Vista/7不允许msiexec被调用的问题.

鉴于您有一个正确暴露COM接口的程序集,我执行了以下操作:

  • 强烈命名的集会.
  • 创建了一个INF文件
  • 使用Visual Studio 2008"安装项目"模板创建MSI.
  • 使用与Windows XP捆绑在一起的"iexpress.exe"创建了一个CAB文件.

创建INF文件

我使用的*.inf文件看起来像:

[version]
signature="$CHICAGO$"
AdvancedINF=2.0

[Setup Hooks]
install=install

[install]
run=msiexec.exe /package """%EXTRACT_DIR%\SampInst.msi""" /qn
Run Code Online (Sandbox Code Playgroud)

你需要改变的唯一一点是SampInst.msi.注意我会使用8.3文件名,因为长文件名可能会导致问题.在测试时,我也不会使用qn开关,因为这是静默安装.

创建安装程序

安装程序只需执行一项操作,即通过调用RegAsm来注册程序集.大多数安装程序将提供一些方法来轻松执行此操作.例如,通过VS 2008创建的安装程序只需要将程序集的"Register"属性设置为"vsdrpCOM"即可.请注意,应选择vsdrpCOM,因为它在构建时生成相应的注册表项.vsdrpCOMSelfRegistration设置可能会失败,因为它在运行时调用RegAsm,因此不适用于非管理员.

将安装程序打包到CAB文件中

这可以通过任何驾驶室归档器完成.Windows XP包含iexpress.exe,一个向导驱动的归档程序,而Microsoft的CAB SDK包含cabarc.exe.其他第三方工具也可用.请注意,如果要对CAB进行签名,则需要在CAB文件中保留用于代码签名的空间.

您将需要CAB INF文件和MSI文件.您不需要CAB Setup.Exe文件.

方便提示:VS2008 Setup Project项目类型允许您在属性中设置构建后步骤,因此您可以在一个步骤中构建和CAB.我的构建后步骤如下:

cd "$(ProjectDir)"
"%WINDIR%\System32\Makecab.exe" /f "VboCslib.ddf"
Run Code Online (Sandbox Code Playgroud)

DDF文件格式已记录在案.

示例HTML页面

object标签用于指向包含安装程序的cab文件.一个非常简单的HTML页面将部署一个ActiveXControl:

<html>
<head></head>
<body>

    <!--
        ID :    The id of the ActiveX control to be used in JavaScript.
        CLASSID : The GUID associated with the ActiveX control.
        CODEBASE: The location containing the CAB installer for the ActiveX 
       control. This could be a URL, or a relative path.
        -->
    <OBJECT ID="MyActiveXControl"
            CLASSID="CLSID:FC36FAE1-48E0-4f6b-B469-E1B5A8C6D1AC"
            CODEBASE="cabfiles\SampleCabFile.CAB#version=1,0,0,0">
        </OBJECT>

        <script>
            MyActiveXControl.SomeMethod();
        </script>
    </body>
    </html>
Run Code Online (Sandbox Code Playgroud)

方便的提示

  • 确保安装程序按"每个用户"安装,而不是"按机器"安装.如果用户没有管理员权限,这将使其更有可能安装.

故障排除

Internet Explorer 6实际上提供了非常有用的诊断辅助工具.清除Internet临时文件,然后导航到网页.如果安装不起作用,请转到临时Internet文件,您将看到其中的几个文件.其中一个将是错误日志启动?CodeDownloadErrorLog.将其拖到桌面并在记事本中打开它,它将提供有关失败时尝试执行的操作的详细信息.

参考

  1. Microsoft KB247257 - 签署.cab文件的步骤
  2. MSDN - 关于INF文件架构
  3. SN.EXE - 具有强名称的强代码程序
  4. Nikolkos Craft - 如何:部署.NET ActiveX控件
  5. CodeProject - 逐步创建ActiveX .NET
  6. CodeProject - 通过CAB文件下载C#ActiveX组件
  7. MSDN - ALLUSERS属性(Windows)
  8. MSDN - 非管理ActiveX控件
  9. MSDN - Microsoft Cabinet格式

更新:Firebreath.org有一个工具集,用于为许多平台生成浏览器插件.用于解决此处提出的问题的IE/ActiveX代码只是一个子集.但截至2014年11月6日,我发现开始使用Firebreath及其说明比尝试构建我的开发环境并从头开始滚动所有自己的解决方案更容易.

  • 请注意,在Windows Vista和Windows 7中,您无法从inf文件启动msiexec并且必须编写bootstarpper或将msi转换为exe (2认同)