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

2023-12-30

我正在拼命尝试部署一个用 C# 开发的 IE 的 ActiveX 作为 CAB 存档。我阅读了很多资源(其中一些来自 StackOverflow),似乎很多人都遇到了同样的问题。我尝试了 3 种解决方案:a)创建 CAB VS 项目,b)使用手动创建 CABCABARC在 INF 中进行 COM 注册,并且 c) 手动创建 CAB 并启动msiexec。他们都没有工作。我什至尝试过 d) 创建一个启动的引导程序msiexec无济于事(因为有些人建议简单地启动msiexec在 Vista 上无法工作)。

我运行的是 Windows Vista,但我的项目即使在 XP 上的 IE6 上也无法运行。

当我使用 MSI 安装 ActiveX 时,在所有 Windows 上一切正常。显然 CAB 的东西不起作用,我还找不到调试整个过程的正确方法。

任何帮助表示赞赏。


更新:请注意,这个古老但优秀的答案仍然是如何解决此问题的一个非常好的概述,至少沿着 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

您唯一需要更改的是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 安装项目项目类型允许您在属性中设置构建后步骤,以便您可以在一个步骤中构建和 CAB。我的构建后步骤如下:

cd "$(ProjectDir)"
"%WINDIR%\System32\Makecab.exe" /f "VboCslib.ddf"

DDF 文件格式为有记录的 http://msdn.microsoft.com/en-us/library/bb417343.aspx#dir_file_syntax.

HTML 页面示例

对象标签用于指向包含安装程序的 cab 文件。部署 ActiveXControl 的非常简单的 HTML 页面将是:

<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>

方便的提示

  • 确保您的安装程序是基于“每用户”而不是“每台计算机”进行安装。如果用户没有管理员权限,这将使其更有可能安装。

故障排除

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

参考

  1. 微软KB247257 http://support.microsoft.com/kb/247257– 签署 .cab 文件的步骤
  2. MSDN http://msdn.microsoft.com/en-us/library/aa741215%28v=vs.85%29.aspx– 关于INF文件架构
  3. SN.EXE http://visualbasic.about.com/od/usingvbnet/a/FWTools5.htm- 使用强名称编写强程序
  4. 尼科尔科斯工艺 http://nikolkos.blogspot.com/2009/08/howto-deploy-net-activex-control.html– 如何:部署 .NET ActiveX 控件
  5. 代码项目 http://www.codeproject.com/KB/cs/CreateActiveXDotNet.aspx– 逐步创建 ActiveX .NET
  6. 代码项目 http://www.codeproject.com/KB/cs/C__Deployment.aspx– 通过CAB文件下载C# ActiveX组件
  7. MSDN http://msdn.microsoft.com/en-us/library/aa367559%28v=vs.85%29.aspx- ALLUSERS 属性(Windows)
  8. MSDN http://msdn.microsoft.com/en-us/library/dd433049%28v=vs.85%29.aspx– 非管理 ActiveX 控件
  9. MSDN http://msdn.microsoft.com/en-us/library/bb417343.aspx– 微软内阁格式

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 CAB 中部署 C# ActiveX 以供 Internet Explorer 使用 的相关文章

  • 查找哪些页面不再与写入时复制共享

    假设我在 Linux 中有一个进程 我从中fork 另一个相同的过程 后forking 因为原始进程将开始写入内存 Linux写时复制机制将为进程提供与分叉进程使用的不同的唯一物理内存页 在执行的某个时刻 我如何知道原始进程的哪些页面已被写
  • OpenCv读/写视频色差

    我试图简单地使用 openCV 打开视频 处理帧并将处理后的帧写入新的视频文件 我的问题是 即使我根本不处理帧 只是打开视频 使用 VideoCapture 读取帧并使用 VideoWriter 将它们写入新文件 输出文件看起来比输入更 绿
  • 使用具有现有访问令牌的 Google API .NET 客户端

    用例如下 移动应用程序正在通过 Google 对用户进行身份验证 并且在某些时候 我们需要将用户的视频发布到他的 YouTube 帐户 出于实际原因 实际发布应该由后端完成 已经存储在那里的大文件 由于用户已经通过应用程序的身份验证 因此应
  • 从 MVC 迁移到 ASP.NET Core 3.1 中的端点路由时,具有角色的 AuthorizeAttribute 不起作用

    我正在尝试将我的项目从 UseMVC asp net core 2 2 兼容样式 升级到 UseEndpoint Routing 并且我的所有请求都被重定向到我的验证失败页面 它与声明有关 如果我删除 Authorize Roles Adm
  • 构造函数中显式关键字的使用

    我试图了解 C 中显式关键字的用法 并查看了这个问题C 中的explicit关键字是什么意思 https stackoverflow com questions 121162 但是 那里列出的示例 实际上是前两个答案 对于用法并不是很清楚
  • 如何使用recv()检测客户端是否仍然连接(并且没有挂起)?

    我写了一个多客户端服务器程序C on SuSE Linux 企业服务器 12 3 x86 64 我为每个客户端使用一个线程来接收数据 我的问题是 我使用一个终端来运行服务器 并使用其他几个终端来运行服务器telnet到我的服务器 作为客户端
  • 暂停下载线程

    我正在用 C 编写一个非常简单的批量下载程序 该程序读取要下载的 URL 的 txt 文件 我已经设置了一个全局线程和委托来更新 GUI 按下 开始 按钮即可创建并启动该线程 我想要做的是有一个 暂停 按钮 使我能够暂停下载 直到点击 恢复
  • IronPython:没有名为 json 的模块

    我安装了 IronPython 我的 python 文件如下所示 import sys print sys version import json 运行它的代码 var p Python CreateEngine var scope p C
  • 如何识别 WPF 文本框中的 ValidationError 工具提示位置

    我添加了一个箭头来指示工具提示中的文本框 当文本框远离屏幕边缘时 这非常有效 但是当它靠近屏幕边缘时 工具提示位置发生变化 箭头显示在左侧 Here is the Image Correct as expected since TextBo
  • Qt 创建布局并动态添加小部件到布局

    我正在尝试在 MainWindow 类中动态创建布局 我有四个框架 它们是用网格布局对象放置的 每个框架都包含一个自定义的 ClockWidget 我希望 ClockWidget 对象在调整主窗口大小时相应地调整大小 因此我需要将它们添加到
  • 生产代码中的 LRU 实现

    我有一些 C 代码 需要使用 LRU 技术实现缓存替换 目前我知道两种实现LRU缓存替换的方法 每次访问缓存数据时使用时间戳 最后比较替换时的时间戳 使用缓存项的堆栈 如果最近访问过它们 则将它们移动到顶部 因此最后底部将包含 LRU 候选
  • 当模板类不包含可用的成员函数时,如何在编译时验证模板参数?

    我有以下模板struct template
  • 耐用功能是否适合大量活动?

    我有一个场景 需要计算 500k 活动 都是小算盘 由于限制 我只能同时计算 30 个 想象一下下面的简单示例 FunctionName Crawl public static async Task
  • 为什么拆箱枚举会产生奇怪的结果?

    考虑以下 Object box 5 int int int box int 5 int nullableInt box as int nullableInt 5 StringComparison enum StringComparison
  • 运算符“==”不能应用于“int”和“string”类型的操作数

    我正在编写一个程序 我想到了一个数字 然后计算机猜测了它 我一边尝试一边测试它 但我不断收到不应该出现的错误 错误是主题标题 我使用 Int Parse 来转换我的字符串 但我不知道为什么会收到错误 我知道它说 不能与整数一起使用 但我在网
  • WinRT 定时注销

    我正在开发一个 WinRT 应用程序 要求之一是应用程序应具有 定时注销 功能 这意味着在任何屏幕上 如果应用程序空闲了 10 分钟 应用程序应该注销并导航回主屏幕 显然 执行此操作的强力方法是在每个页面的每个网格上连接指针按下事件 并在触
  • 实例化 Microsoft.Office.Interop.Excel.Application 对象时出现错误:800700c1

    实例化 Microsoft Office Interop Excel Application 以从 winforms 应用程序生成 Excel 时 出现以下错误 这之前是有效的 但突然间它停止工作了 尽管代码和 Excel 版本没有变化 我
  • 使用 Crypto++ 获取 ECDSA 签名

    我必须使用 Crypto 在变量中获取 ECDSA 签名 我在启动 SignMessage 后尝试获取它 但签名为空 我怎样才能得到它 你看过 Crypto wiki 吗 上面有很多东西椭圆曲线数字签名算法 http www cryptop
  • 匿名结构体作为返回类型

    下面的代码编译得很好VC 19 00 23506 http rextester com GMUP11493 标志 Wall WX Za 与VC 19 10 25109 0 标志 Wall WX Za permissive 这可以在以下位置检
  • 错误:无效使用不完整类型“类 Move”/未定义对 Move::NONE 的引用

    拜托 我不知道为什么这个简单的代码被拒绝 它给了我 2 个编译错误 请帮帮我 I use 代码 块 20 03 我的编译器是GNU GCC 移动 hpp class Move public Move Move int int public

随机推荐

  • 使用 Android 提交至 Google 电子表格表单

    第一次在这里提问 通常我不用问就能找到答案 但这一次我陷入了困境 无法弄清楚我错过了什么 我只是想让我的 Android 应用程序在网站上填写表格并提交 我不需要应用程序对发回的任何数据执行任何操作 只需填写表格并提交即可 基本上我正在尝试
  • Dalvik JIT 工作流程

    我对 dalvik vm Android 感兴趣 我试图通过 JIT 的代码来找出它执行的操作以及它如何选择跟踪 我无法遵循代码 因此 我请求所有人帮助我建议 JIT 中执行跟踪选择和翻译的相关函数 你可以尝试 git log grep J
  • 调用命令行程序的Web应用程序框架

    我们正在设计一个 Java EE Web 应用程序 在 tomcat 上运行 它旨在成为命令行程序的网络界面 是否有任何框架 应用程序允许这样做 即 JSP 页面将在内部向安装在与 Tomcat 服务器相同的服务器上的程序发出命令 命令行是
  • 左连接和左外连接的区别

    我想知道mySQL中的LEFT JOIN和LEFT OUTER JOIN是否有什么区别 如果没有区别那为什么会有两种不同的方式呢 提前致谢 它们是相同的 我认为您想要放入 外部 的唯一原因是为了清楚起见 为了澄清联接中的第一个表不需要它在第
  • extjs 面板适合布局

    我有一个面板 我正在将它渲染到一个容器中 我想要panel以适应containerheight 并且不想指定高度panel 但似乎不起作用 有什么办法可以做到吗 代码片段 div style width 100 height 100 div
  • 将 CellRendererToggle 的单行设置为不一致

    在 Gtk 3 上 我使用的是TreeModel存储嵌套信息并用 a 显示它CellRendererText and a CellRendererToggle 用户可以单击每个切换按钮 当存在嵌套按钮并且它们不处于相同状态时 我希望上层按钮
  • React 暴露组件函数

    基于此链接上的示例http reactjs cn react tips expose component functions html http reactjs cn react tips expose component function
  • 带有列表项的 GWT 无序列表

    我完全坚持在 gwt 中创建 css 驱动的菜单 在渲染的结果中 它应该看起来完全像这样 div class topbar div class container fixed h3 a href class logo test a h3 u
  • 制作Python批处理文件

    如何创建一个bat文件来运行python文件 特别是包含pygame bat文件 Simple 只需将以下内容作为批处理文件的第一行 python x 0 goto eof 批处理文件的其余部分是 Python 程序 这是一个完整的例子 p
  • 捕获具有同一组的 和 (thisPartOnly)

    假设我们有以下输入
  • 在 JSF 中验证字段并抛出异常,但将错误消息附加到另一个字段?

    我的页面上有一些需要交叉验证的字段 但我不希望此验证中显示错误
  • 如何从球衣servlet中的curl请求中提取参数?

    我正在以表格形式向我的球衣 servlet 发出一个curl post Restful请求 curl i X POST d debit user id custome mobile number 917827448775 http loca
  • Hive 将 ORC 文件分割成小部分

    create table n data MARKET string CATEGORY string D map
  • 检测 Mono 中的符号链接和管道

    有没有办法使用 C 和 Mono 来区分特殊文件 例如符号链接和管道 该应用程序是一个多平台备份工具 因此我想避免使用互操作库或 C DLL 并寻找直接托管代码解决方案 经过更多研究后 我找到了解决方案 添加参考MonoPosix项目可以访
  • 图像未保存在文件夹中

    我正在尝试创建一个文件夹并在其中保存图像 但这不起作用 我不知道我的代码出了什么问题 你能告诉我为什么吗 The method that invoke of uploading images public void openGallery
  • 将 QLineEdit 设置为仅接受数字

    我有一个QLineEdit用户应仅输入数字 那么是否有一个仅限数字的设置QLineEdit QLineEdit setValidator 例如 myLineEdit gt setValidator new QIntValidator 0 1
  • Microsoft 的 CodeView 格式规范

    我一直在寻找 1990 年代的 Microsoft 文档 名为CodeView 符号调试信息规范 微软在他们的文章中引用了它PE COFF规格 http elfz laacz lv ms exe spec html L61 关于该文档的信息
  • 如何通过VSTS构建和部署SSRS项目?

    我在 VS2015 中创建了简单的 SSRS 项目 我想通过创建构建定义和发布定义步骤来使用 VSTS 构建和部署 SSRS 项目 是否有任何第三方 VSTS 扩展可用 或者对于 SSRS 构建和 SSRS 部署与 SSIS 构建和 SSI
  • 子类化流

    我有兴趣创建自己的 Stream 子类 并且想知道应该重写哪些方法 部署在 pharo 和 Gemstone 上 我有一个包含各种类型事物的集合 我希望能够流式传输它的子集 其中包含类的元素 我不想复制集合或使用collect 块 因为集合
  • 在 CAB 中部署 C# ActiveX 以供 Internet Explorer 使用

    我正在拼命尝试部署一个用 C 开发的 IE 的 ActiveX 作为 CAB 存档 我阅读了很多资源 其中一些来自 StackOverflow 似乎很多人都遇到了同样的问题 我尝试了 3 种解决方案 a 创建 CAB VS 项目 b 使用手