在 IE 中承载 Winform 应用程序

转载 2015年07月10日 00:15:14
在 Windows 平台上,.Net 的 CLR 可以由三种程序启动及初始化:Shell 程序(explorer.exe)、IE 浏览器和IIS(其辅助进程aspnet_wp.exe)。对于需要丰富的交互操作,而用户又不想安装客户端软件的项目,以 IE 做宿主,承载用.Net 开发的 Winform 应用程序在其上运行,有时也是一个不错的选择。
一、工作原理
    以 IE 承载 Winform 程序运行,一般都是在网页上运行具有丰富交互功能的 Winform 用户控件。其工作流程如下:首先把 Winform 控件程序集及其依赖程序集(.dll)放在网站某个目录下,然后用户用 IE浏览网页时,如果该网页用到了 Winform 用户控件,则浏览器会自动把这些程序集下载到客户端 IE 的临时目录,之后 IE会创建一个应用程序域加载并运行这些程序集,则用户就在网页上看到了 Winform 控件,当然还可以执行这个控件的功能,比如弹出Winform 窗体等。

二、开发过程
1. 开发 Winform 用户控件库,比如 MyControls.dll。
2. 建立 ASP.Net 网站,在网页的 HTML 代码中加入 <object> 标签调用 Winform控件,格式如:
<OBJECT id="myControl" height="100%" width="100%"classid="http:.\WinformCtrl\MyControls.dll#MyControls.MyChartControl"VIEWASTEXT>
  <param name="ChartName" value="aaaaa">
  <param name="ChartColor" value="Red">
</OBJECT>
    其 classid 属性是关键,“#”号前面是到哪儿找 Winform程序集,后面是控件的完全限定名。用 param 给控件传入属性数据。
3. 编译发布网站,在 IIS 中创建虚拟目录发布之,比如 http://192.168.0.1/MyWinApp/*。
4. 在客户端用 .Net Framework 的配置工具配置计算机的运行库安全策略(创建 URL 类型的代码组),比如给来自http://192.168.0.1/MyWinApp/*的程序集以 FullTrust 权限集。可以在命令行下用代码访问安全策略工具 Caspol.exe:
    caspol -quiet -machine -addgroup All_Code -url http://192.168.0.1/MyWinApp/*FullTrust -n 192.168.0.1_MyWinApp -d "用 IE 承载 Winform 控件测试网站"
5. 在客户端用 IE 浏览网站,在网页上显示 Winform 控件并可执行功能。
三、实践经验
1. 下载程序集的位置
用 IE 承载的 Winform 控件程序集及其依赖程序集,运行时会被自动下载到 IE 的临时目录,但这些程序集不能从 ASP.Net网站的 Bin 目录下下载,必须要另外建一个目录( 如 WinformCtrl )以供存放和从中下载。
2. 配置文件
寄宿于 IE 的应用程序如果有配置文件,则配置文件可以放在能从网站下载的地方,比如 WinformCtrl 目录中,并在网页的HTML 代码中用 <link> 标记指定,格式为:
<link rel="CONFIGURATION"href="WinformCtrl/MyControls.dll.config" />
MSDN中说必须“将配置文件与可执行文件置于相同位置。”,但经试验,发现不仅配置文件的名称可以任意命名,连位置也不一定要跟可执行文件在同一目录,只要能根据<link> 标记找到即可。
从配置文件的使用可以看出 IE 创建应用程序域的原则:所有指向同一配置文件的页在同一应用程序域中创建。这样,就可以基于每个配置文件创建应用程序域。
3. 程序调试
不好调。Winform 控件库的开发阶段还可以用一个 C/S 程序模拟 IE 调试其功能,但在 IE 中调用 Winform控件库运行后,只能通过 IEHost.dll 生成一个 IE 的调试日志文件。生成 IE 调试日志的方法是通过改注册表激活IEHost:
a.找到并单击下面的注册表项:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework
b. 在该项中添加一个名为DebugIEHost 的 DWORD 值,然后为其指定一个任意非零值。
c. 添加一个名为IEHostLogFile的字符串值。为该值指定用于记录调试日志的文件的完整路径(包括文件名)(例如,C:\Temp\IEDebug.log)。
调试时还要注意可能需要手工更新下载程序集缓存,即用 gacutil /cdl 命令清空C:\WINDOWS\assembly 的 Download 目录。
总的来说,用 IE 承载 Winform 应用程序的实现方案,既有在浏览器上可获得 Winform 强大用户体验的优势,也有诸多不足:首先是客户端安全配置比较麻烦;其次是有时依赖程序集不好定位;再就是客户端下载程序集缓存不好更新。针对这些不足,微软的 SilverLight 也许是个更好的解决方案。

参考:
使用 Internet Explorer 部署运行库应用程序
http://msdn.microsoft.com/zh-cn/library/a7as3z1d.aspx
HOW TO:使用 IEHost 日志调试 Internet Explorer 中承载的 .NET 对象
http://support.microsoft.com/kb/313892/zh-cn
.Net托管世界的应用程序域和线程
http://blog.csdn.net/shanhe/archive/2004/11/03/164580.aspx

C# 服务自承载,在Winform或控制台中发布WebService

1、创建控制台项目 在
  • wangdaoyin2010
  • wangdaoyin2010
  • 2014年11月03日 15:28
  • 2745

WCF学习心得----(三)服务承载

WCF学习心得----(三)服务承载 这一章节花费了好长的时间才整理个大概,主要原因是初次接触这个东西,在做练习实践的过程中,遇到了很多的问题,有些问题到目前还没有得以解决。所以在这一章节中,前两个承...
  • xuemoyao
  • xuemoyao
  • 2013年07月11日 23:13
  • 2865

Winform下ToolStrip承载自定义控件或 Windows 窗体控件。

如题,使用ToolStripControlHost。 先看MSDN上介绍的: ToolStripControlHost  是 ToolStripComboBox、ToolStripTextBox 和 ...
  • yuankaiwsl
  • yuankaiwsl
  • 2016年07月05日 14:42
  • 1256

关于vs2013调试的偶然错误发现与总结(vs2013的承载进程)---ShinePans

当项目的属性选择为  启用 vs2013承载进程 或出现一下错误: 尝试运行项目时出错:未能加载文件或程序集"GroupBoxTest" 或它的某一个依赖项.给定程序...
  • panshang1994
  • panshang1994
  • 2014年05月15日 22:41
  • 2009

在C#应用程序中获取和设置IE浏览器Cookie

最近写程序,需要使用C#应用程序访问一网站,获取相应的Cookie,然后使用该Cookie用IE浏览器打开指定的页面。恩,好比用QQ打开浏览器自动登录你的QQ空间。 从网上了解了下,一般都是用非托管动...
  • kobayasi
  • kobayasi
  • 2009年04月10日 21:49
  • 9828

验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的...

验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。   解决办法...
  • hutao1101175783
  • hutao1101175783
  • 2015年09月29日 22:16
  • 3574

SpringMVC在IE下出现无法启动应用程序的错误!

最近SpringMVC的项目,form提交返回String 具体代码如下 @RequestMapping(value="/TestSubmit") @ResponseBody public Str...
  • youyedemeng
  • youyedemeng
  • 2015年08月13日 17:45
  • 1101

winform中使用IE

在工具箱里右击,选添加/删除选项,在弹出的对话框里选Com组件选项卡,找到Microsof Web浏览器组件,确定,在工具箱里选择WebBrowser控件,拖放到窗体上,然后写代码:private v...
  • qunw
  • qunw
  • 2004年06月24日 08:15
  • 602

web显示winform,web打开winform,IE打开winform

前言:为什么要用ie打开winform  个人认为,winform部署客户端太麻烦如金蝶··用友,winfrom打补丁太麻烦,添加新功能再部署非常费时间;于是就想为什么不能用IE打开呢?这样就不需要部...
  • suheonline
  • suheonline
  • 2014年06月24日 18:44
  • 2191

专用承载和默认承载

由于EPS的接入网结构更加扁平化,即由UMTS的RNC和NodeB两个节点简化到只有eNode B一个节点,从而在QoS的结构上也有所变化。演进系统的QoS结构相比UMTS进行了简化。同时由于希望更好...
  • image1986
  • image1986
  • 2011年08月24日 14:39
  • 14625
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在 IE 中承载 Winform 应用程序
举报原因:
原因补充:

(最多只允许输入30个字)