绕过传统activex 在页面使用方法,使用c#写的activex控件

  需求一开始是在页面中嵌入用c#写的rldc编辑器,参照传统activex思路,还看了微软一站式编程中的例子,均告失败。
  后经反复研究。找出了问题所在,成功把编辑器弄进了web页面。在ie6,7,8中均通过。客服端安装activex相应的framework。
  其实通过这种方法,在web中, 可以任意使用.net写的dll.
 
 主要问题
 1, IE 加载DLL(英文关键字,ie host)
     由于IE安全限制,可能导致客服端不能从服务器端把dll下载,并加载进IE。
     解决方法,把站点加入信任站点。
 2,DLL本地运行安全限制
     托管dll并没有在本地注册,所以可能会遇到权限不够,而不能运行的问题。
      解决方法,一个是不管那么多,修改.net framework的信任级别。
      二强名称签名,然后根据签名设置权限。
      三根据dll所在目录路径设置权限
    本文所用方法是第一种,修改.net framework的信任级别。
    若是要研究第二和第三种方法请Google : caspol -chggroup 1.5 FullTrust
     还有这些链接可能对你有帮助
     http://thebackroomtech.com/2009/04/01/using-caspolexe-to-grant-net-applications-rights-to-a-remote-network-share/
     http://support.microsoft.com/kb/313892/en-us
应用举例
 步骤:
   一,应用页面配置:

    1,嵌入页面
        <div id="designContainer" runat="server" style="display: none; 100%; height: 100%">
        <object id="reportDesigner" name="reportDesigner" classid="http:ReportDesign.dll#fyiReporting.ReportDesign.ReportDesignCtrl"
            width="100%" height="100%">
            <param name="UserNo" id="UserNo" value="<%=UserNo%>" />
            <param name="WebServiceURL" id="WebServiceURL" value="<%=xriskHost%>/WebService/ReportWebService.asmx" />
        </object>
    </div>
    2,检测用户是否已安装.net framework。
     $(document).ready(function() {
            if (navigator.userAgent.indexOf(".NET CLR") > -1) {
               
            } else {
                alert("因客户端未安装.net运行时");
            }
        });

        //试图从js调用dll,注意有个延时,以防第一次加载需要时间比较长。
 function getObj() {
            var obj = $("#reportDesigner").get(0);
            tryCount += 1;
            if (obj && obj.LoadFlag == "1") {
                $("#designContainer").show();
                loadingPanel.Hide();

                if (reportCode) {
                    obj.EditReport(reportCode, reportName);
                } else {
                    obj.CreateReport();
                }
            } else {
                if (tryCount < 10) {
                    window.setTimeout("getObj()", interval);
                } else {
                    alert("加载报告设计器失败!请下载执行初始脚本!");
                    $("#designContainer").hide();
                    $("#downloadContainer").show();
                    loadingPanel.Hide();
                }
            }
        }


  二,下载dat处理文件并执行
   文件内容,注意//后面是我加的注释,具体运行时需要去掉,里面的ip地址可以替换成自己的站点地址
     @ECHO OFF
add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range1000"
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range1000" /v http /t REG_DWORD /d 0x00000002 /f
//添加信任站点
reg add "HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\ZoneMap\Ranges\Range1000" /v :Range /t REG_SZ /d 191.168.0.54 /f
//允许该站点弹出窗口
reg add "HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\New Windows\Allow" /v 191.168.0.54 /t REG_SZ /d 0 /f
//设置信任级别
cd C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727
caspol -chggroup 1.5 FullTrust
//第一次访问站点,关掉当前窗口,并重新打开窗口
taskkill /f /im iexplore.exe
start iexplore http://191.168.0.54:80/xx/login.aspx

 三,让dat脚本能被客服端浏览器访问还要做些手脚
    1,IIS-文件夹-属性-http头-MIME类型添加:batapplication/batch

    2,访问bat文件所在目录,将文件安全性中加入IE匿名访问帐户。这个账户即是iis中那个匿名账户,或者说是asp.net运行时的模拟账户。
   
PS:
  从bat脚本来看,很明显这段代码是可以通过递送web地址来拼凑的,目前我们是在登录页面里,解析出站点url,
  然后写一份bat到服务器,在登录页面给出固定链接,这样部署起来,工程人员不用随站点地址变化而修改bat文件。
 

原文地址:https://www.cnblogs.com/wusong/p/1735677.html