草庐IT

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

coder 2024-05-24 原文

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

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

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

任何帮助表示赞赏。

最佳答案

更新:请注意,这个古老但出色的答案仍然是如何解决这个问题的一个很好的概述,至少与 Win7 和 IE11 的演进规模一样。我刚刚使用 Answerer 的 Firebreath.org 工具集作为起点,成功地完成了所有工作。这并不简单,但可以做到。我在下面的引用列表中添加了对该项目的引用,因为它可能比此概述更适合当前的开发人员。

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

鉴于您有一个正确公开 COM 接口(interface)的程序集,我执行了以下操作:

  • 强命名程序集。
  • 创建了一个 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 创建的安装程序只需要将程序集的“注册”属性设置为“vsdrpCOM”。请注意 vsdrpCOM 应该选择它,因为它会在构建时生成适当的注册表项。 vsdrpCOMSelfRegistration 设置可能会失败,因为它在运行时调用 RegAsm,因此不适用于非管理员。

    将安装程序打包成 CAB 文件

    这可以由任何 cab 存档器完成。 Windows XP 包含 iexpress.exe,一个向导驱动的归档程序,而 Microsoft 的 CAB SDK 包含 cabarc.exe。其他 3rd 方工具也可用。
    请注意,如果您要对 CAB 进行签名,则需要在 CAB 文件中为代码签名保留空间。

    您将需要对 INF 文件和 MSI 文件进行 CAB。您将不需要 CAB Setup.Exe 文件。

    方便的提示:VS2008 安装项目项目类型允许您在属性中设置构建后步骤,因此您可以在一个步骤中构建和 CAB。我的构建后步骤如下所示:
    cd "$(ProjectDir)"
    "%WINDIR%\System32\Makecab.exe" /f "VboCslib.ddf"
    

    DDF 文件格式为 documented .

    示例 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 开头的错误日志。将它拖到您的桌面并在记事本中打开它,它会提供有关失败时尝试执行的操作的详细信息。

    引用
  • Microsoft KB247257 – 签署 .cab 文件的步骤
  • MSDN – 关于 INF 文件架构
  • SN.EXE - 具有强名称的代码强程序
  • Nikolkos Craft – 如何:部署 .NET ActiveX 控件
  • CodeProject – 一步一步创建 ActiveX .NET
  • CodeProject – 通过 CAB 文件下载 C# ActiveX 组件
  • MSDN - ALLUSERS 属性 (Windows)
  • MSDN – 非管理员 ActiveX 控件
  • MSDN – 微软内阁格式

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

    关于c# - 在 CAB 中部署 C# ActiveX 以供 Internet Explorer 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5484326/

    有关c# - 在 CAB 中部署 C# ActiveX 以供 Internet Explorer 使用的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    3. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    4. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    5. ruby - 在 Ruby 中使用匿名模块 - 2

      假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

    6. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

      我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

    7. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    8. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

      我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

    9. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

      我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

    10. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

      我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

    随机推荐