项目管理开发

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

 

Hosting a Windows Form Control in a web page

Although it is not the most common use of it, it is possible to host a Windows Form Control in a Web Page and run it from within Internet Explorer. This allows to build powerful client side functionality with all the advantages of using the .Net framework and executing the control in the client side. Of course there are some restrictions that cannot be left aside. At least the .Net framework must be installed on the client for the control to run. In addition, it is possible that some permission must be granted to the control, too, depending on the actions the control will take on the client machine.
Let’s build an example to see how this works:
1. Create the Windows Form Control
Create a “Windows Control Library” project in Visual Studio. For this simple example we will add a label to the control and a public “SendMessage” method to change the label’s text. In order to be able to call the method from IE, we will set the control’s COMVisible attribute to true.
 
using System;
using System.Windows.Forms;
using System.Runtime.InteropServices;
 
namespace WindowsControlLibrary1
{
    [ComVisible(true)]
    public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }
 
        public void SendMessage(string msg){
            _lblMessage.Text = msg;
        }
    }
}
 
2. Create the hosting HTML document
 
The control will be hosted using the HTML <object> element. In its classid attribute we will place the control's reference in the following manner: classid="http:[relativePath/]<winControlAssemblyName>.dll#<ControlNamespace>.<ControlClassName>". For this example we will have an HTML page (index.html) with the following code:
 
<!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>       
  <title>Windows Form Control Test Page</title>       
 <script type="text/javascript">           
    function SendMessageToWinControl()
    {                     
     var winCtrl = document.getElementById("MyWinControl");                   
     winCtrl.SendMessage("Message sent from the HTML page!!");               
    }       
  </script>   
 </head>   
 <body>       
 <h1>Windows Form Control:</h1>       
  <object id="MyWinControl" classid="http:WindowsControlLibrary1.dll#WindowsControlLibrary1.UserControl1"           
          height="100" width="300" VIEWASTEXT/>       
  <br/><br/>       
 <input type="button" onclick="SendMessageToWinControl()" value="Send Message" />   
 </body>
</html> 
  
3. Deploy the sample
 
Copy both the index.html page and the control library WindowControlLibrary1.dll to a directory (we will name it WinControlTest). In the “Web Sharing” dir properties select  Share this folder, leave the default alias and application permissions to Scripts and make sure not to select  the Execute permission).
 
4. Try it in Internet Explorer
 
Open the page http://localhost/WinControlTest/index.html in Internet Explorer. We can see the control hosted in the html page:
 
 
By clicking the Send Message button, we will call the Control's SendMessage method from javscript. Resulting in the label's text changed:
 
 
 
If you modify the control after its first use, you will need to close IE, replace the control's dll in the virtual directory and clean the contents of the download cache. You do this cleaning using the following command: "gacutil /cdl".To list the contents of the download cache use "gacutil /ldl".
 
This solution is not intended to replace a WebControl or any common web artifact. But is good to know it can be use in an uncommon scenario if needed.
posted on 2008-10-28 14:50  tiger534  阅读(727)  评论(0编辑  收藏  举报