• C# 将DLL制作CAB包并在浏览器下载,自动安装。(Activex)(包括ie打开cab包一直弹出用户账户控制,确定之后无反应的解决办法。)


    制作Activex程序网上有很多方法我就不说了,我的业务主要做的就是将DLL打包成CAB供浏览器下载。

    下面制作证书,以及制作cab包需要用到一些工具。我将工具包上传到自己的博客园里了,以供大家下载。

    工具包下载地址:https://files.cnblogs.com/files/Scholars/CABTest.7z

    一,制作安装程序。

    先新建一个安装程序。我用的是VS 2017,目前来说VS 2012以后VS默认已经不携带自定义安装部署程序了。这是需要去下载一个,下载地址:https://marketplace.visualstudio.com/items?itemName=VisualStudioClient.MicrosoftVisualStudio2017InstallerProjects

    由于我是DLL打包,所以这个地方选择添加文件。将要打包下载的DLL全部添加进来。

    随后针对于你的DLL,F4属性,将Register更改为vsdraCOM。意思是与COM组件相关联。

     

     

     接下来针对于Application Folder,F4属性有个DefaultLocation默认安装地址。我这边直接暴力写死在C盘。

     随后,挺重要的一点。

     对项目F4查看属性,有一个ProductCode,设置成你的Activex所要调用的guid。

     随后就可以生成,生成之后便会有一个msi文件。接下来就可以制作cab包了,以及证书签名了。

    在debug里有exe跟msi。exe是安装程序,msi用于cab用。

     

     二,生成cab包。

    如果只是生成了msi文件,用户安装的时候比较麻烦,像安装一般软件一样,需要用户慢慢点击下一步,慢慢安装,在本项目中采用打包成cab文件的方式,做到用户点击运行后,即可自动安装。

    需要准备以下文件有:

    (1)cabarc.exe:微软提供的cab打包工具

    (2)SetupByte.msi:  本案例中SetupByte项目生成的windows部署安装文件

    (3)install.inf : 需要跟EasySetup.msi打包在一起的文件,制作方法请见下文

    (4)build.bat:  打包的批处理命令,制作方法请见下文

    (5)RunBat.exe:用于通过C#程序以管理员权限,注册DLL写入注册表的程序。可依据自己的需求进行去留操作。

    1, install.inf,inf文件制作。inf文件主要是用于,ie打开浏览器时读取cab包之后。首先自动运行inf文件,随后由inf文件调取msi文件实现自动安装。

    这个文件挺麻烦,我搞了好久也不太懂。反正有些类似于批处理。其中[version]是必须写的,[Setup Hooks]好像运行inf文件之后的运行顺序。

    [hook1] 则是调用windows自带的msiexec.exe程序去执行msi文件进行安装

    run=msiexec.exe /i "%EXTRACT_DIR%SetupByte.msi" /qn

    后面加上/qn,则是静默安装。无交互式,由于我这边需要跟用户做一些交互所以去掉了静默安装。

    [hook2]则是我调用了一个程序,用来调用我写的批处理文件。通过C#程序,以管理员权限来注册DLL,写注册表。

    [version]  
    signature="$CHICAGO$"  
    AdvancedINF=2.0  
    
    [Setup Hooks]  
    hook1=hook1
    hook2=hook2
    
    [hook1]  
    run=msiexec.exe /i "%EXTRACT_DIR%SetupByte.msi"
    
    [hook2]
    run=%EXTRACT_DIR%RunBat.exe

    2,build.bat制作。新建txt文件,加入以下内容,将文件名重新命名build.bat即可。其中SetupPackagev1.cab是生成目标cab的名称;install.inf是第一步生成的文件名,而SetupByte.msi是需要打包的安装程序名;第二条ping命令仅仅是让批处理不要那么快退出,起到更利于观察生成结果的作用。

    "cabarc.exe" -s 6144 n SetupPackagev1.cab install.inf SetupByte.msi RunBat.exe
    ping -n 20 127.0.0.1 >nul

    把以上五个文件复制到同一个文件夹中,双击build.bat批处理命令即可生成cab文件。由于我需要携带上我写的一个C#控制台注册DLL程序,就也携带上了。所以“RunBat.exe”可以去掉不是必须。

     这时cab包中,包含的就是inf,msi,exe(注册DLL写注册表程序(可不要))三个程序。

     三,对cab包进行数字签名及证书制作

    cmd切换到makeCAB目录

     然后输入如下命令:makecert /sv "RemtCard.pvk" /n "CN=公司名称" -r RmtCard.cer

    会弹出私钥设置界面:

     再次确认密码之后会生成两个文件:

     创建SPC测试软件出版商证明书,在命令行中输入“cert2spc RmtCard.cer RmtCard.spc”

    出现以下三个文件就表明证书生成成功了,接下来给cab包进行签名。

     

    运行signcode.exe

     选择需要签名的cab包

    自定义:

     

     从文件选择,选择你刚生成的证书:

     再以刚刚的操作,在你生成文件夹的地方找到私钥文件:

    输入你设置的私钥密码:

     

     哈希算法选择sha1

     其他证书选择

     随后一直点击下一步,弹出私钥密码输入窗口输入你的私钥密码即可。

    四,HTML在线测试cab包

    新建一个HTML文件,内容如下:

    classid为你Activex程序的guid,路径需要写相对路径。

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html;charset=utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=9" >
        <!-- <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> -->
        <!-- <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE9" > -->
        <meta content="always" name="referrer">
        <meta name="theme-color" content="#2932e1">
        <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
         <hr />
         <div>
             <div>
                 <a href="makeCAB/RmtCard.spc">第一次运行,请先下载并安装根证书。</a>
                 <h3>或者</h3>在浏览器安全设置上面设置为“下载未签名Activex”,等安装成功后再将浏览器设置还原。
             </div>
             <object id="csharpActiveX" codebase="CAB/SetupPackagev1.cab?v=2" classid="clsid:{67631A1F-4AA9-469C-A7DE-E12C51130000}">
                 <div>aaa</div>
             </object>
            <!-- 67631A1F-4AA9-469C-A7DE-E12C51130000 -->
         </div>
        </form>
    </body>
    <script>
        var doc = document.getElementById("csharpActiveX")
          var a3 = doc.PatientIdentification("");
        alert(a);
    </script>
    </html>

    五,生成完毕后测试出现的问题,及解决方式。

     一,ie无法自动安装

    我在测试期间,有些同事的电脑打开ie可以直接调起安装程序,有些却不可以。思来想去找了很久,大概花了三天的时间也没解决。那些不可以调起安装程序的是因为ie运行cab包时一直弹出用户控制窗口,点击是之后没有任何反应。

    解决办法:将ie以管理员身份运行。ie在打开你的测试界面时,就不会弹出用户控制窗口。而是直接调用安装程序!

    二,注册DLL的批处理无法自动执行

    msi安装成功之后,注册DLL的批处理无法自动执行,并写入注册表。也是头疼。

    解决办法:新建一个控制台程序,以管理员方式调用批处理文件。进行注册DLL写入注册表。(因为我在安装部署时,就已经把DLL的安装地址写死了。你们依据自己的情况进行修改)

                using (Process proc = new Process())
                {
                    string command = @"C:SetupByteBytePluginReg.bat";
                    proc.StartInfo.FileName = command;
                    proc.StartInfo.WorkingDirectory = Path.GetDirectoryName(command);
    
                    //run as admin
                    proc.StartInfo.Verb = "runas";
    
                    proc.Start();
                    while (!proc.HasExited)
                    {
                        proc.WaitForExit(1000);
                    }
                }
  • 相关阅读:
    数据库连接 执行 select 语句
    cygwin完全安装步骤方法(组图)
    Android 8位颜色值和6位颜色值的区别
    执行带参数的sql语句
    [Android环境搭建] 申请Android Map API Key
    调用存储过程
    [Android]应用语言切换的三种方法
    JS 的魅力
    Android工程 引用另外一个Android工程
    使用XML Security验证XML文件的数字签名
  • 原文地址:https://www.cnblogs.com/Scholars/p/13745481.html
Copyright © 2020-2023  润新知