你目前正处于脱机状态,正在等待 Internet 重新连接

如何: 接收器 Internet 浏览器脚本中的托管的 C# 事件

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 313891
本文已归档。它按“原样”提供,并且不再更新。
为这篇文章的一个 Microsoft Visual Basic.net 版本,请参阅 316516

下面的 Microsoft.net 框架类库命名空间引用这篇文章:
  • System.Runtime.InteropServices

本任务中

概要
本文分步介绍如何从组件对象模型 (COM) 客户端 (非托管代码) 接收托管的事件时您编写.net Windows 控件。例如对于您接收托管的事件从 COM 客户端在 Internet Explorer 中运行脚本时。

有关如何编写和使用从 COM 的托管的类型说明,请参阅以下 Microsoft.net 框架开发人员指南文档: back to the top

要求

下面的列表概述了建议的硬件、 软件、 网络的基础结构和服务包,您需要:
  • Microsoft Visual Studio.net
  • Microsoft Internet Explorer 编程 5.5 或更高版本
back to the top

步骤来接收托管事件在 Internet 浏览器脚本

  1. 创建自定义 Windows 窗体控件,请执行以下操作:
    1. 启动 Microsoft Visual Studio.net。
    2. 文件 菜单上指向 新建,然后单击 项目
    3. 新建项目 对话框中在 项目类型 框中,单击 Visual C# 项目,然后单击在 模板 下的 Windows 控件库
  2. 定义为公开事件源接口。
  3. GuidAttribute 类添加到源接口。必须设置作为类型 Guid 可以接受的构造函数参数传递给该属性的字符串的格式。您可以使用 Guidgen.exe 文件创建一个未使用的 GUID
    [GuidAttribute("0422D916-C11A-474e-947D-45A107038D12") ]        public interface ControlEvents 		    {        //  Insert code here.    }					
  4. 要公开作为 IDispatch 的接口的 COM 源接口添加 InterfaceType 属性:
    [InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]    public interface ControlEvents 		    {               // Insert code here.    }					
  5. 在源接口中指定 COM 调度标识符 (DISPID) 的方法或字段的任何成员中添加一个 DispIdAttribute
    public interface ControlEvents 	    {        [DispIdAttribute(0x60020000)]        void ClickEvent(int x, int y);    }					
  6. 创建新的事件类型来包装公开的所需的事件。
  7. 在自定义的 Windows 窗体控件上实现源接口。
  8. 若要标识的接口公开为 COM 事件源的列表控件中添加 ComSourceInterfaces 属性:
    [ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(ControlEvents))]	public class MyWindowControl : System.Windows.Forms.UserControl     {      // Insert code here.    }					
  9. 编译控件作为动态链接库 (DLL) 文件。
  10. 在与挂钩事件的 HTML 页上创建一个脚本块。例如:
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"><META HTTP-EQUIV='Content-Type' CONTENT='text/html; charset=iso-8859-1' /><HTML>	<HEAD>		<TITLE>Sink managed event in Internet Explorer</TITLE>					</HEAD>		<BODY>				<OBJECT id="ctrl" classid="YourDllName.dll#ActiveXSourcing.MyWindowControl">		</OBJECT>		<SCRIPT LANGUAGE="JScript">            function ctrl::ClickEvent(a,b)            {                alert("MyWindowControl_ClickEvent");            }		</SCRIPT>			</BODY></HTML>					
  11. 所有的客户端系统上使用.net 框架配置工具 (Mscorcfg.msc) 授予程序集所需的各个权限。
back to the top

完成代码列表

using System;using System.ComponentModel;using System.Drawing;using System.Windows.Forms;using System.Runtime.InteropServices;namespace ActiveXSourcing{	public delegate void ClickEventHandler(int x, int y); 	//Source interface for events to be exposed.	//Add GuidAttribute to the source interface to supply an explicit System.Guid.	//Add InterfaceTypeAttribute to indicate that interface is IDispatch interface.	[GuidAttribute("0422D916-C11A-474e-947D-45A107038D12") ]	[InterfaceTypeAttribute(ComInterfaceType.InterfaceIsIDispatch)]	public interface ControlEvents 		//Add a DisIdAttribute to any members in the source 		//interface to specify the COM DispId.	{		[DispIdAttribute(0x60020000)]		void ClickEvent(int x, int y);	}	//Add a ComSourceInterfaces attribute to the control to 	//identify the list of interfaces that are exposed as COM event sources. 	[ClassInterface(ClassInterfaceType.None),ComSourceInterfaces(typeof(ControlEvents))]	public class MyWindowControl : System.Windows.Forms.UserControl 		//, ComInteropControlInterface	{        System.Windows.Forms.TextBox tx = new TextBox();		private void InitializeComponent()		{						this.Name = "MyWindowControl";		}			event ActiveXSourcing.ClickEventHandler ClickEvent;    			public MyWindowControl() : base()		{				               			initMyWindowControl();		}        		private void initMyWindowControl() 		{			Size = new System.Drawing.Size(300, 50);			tx.Text = "Click on the TextBox to invoke  'ClickEvent'";			tx.Size = this.Size;                  			tx.Click += new System.EventHandler(ClickHandler);			this.Controls.Add(tx);					}                    		private void ClickHandler(object sender, System.EventArgs e)		{			if (ClickEvent != null) 			{				ClickEvent(0, 0);			}		}	}}				
back to the top
参考
有关详细的信息,请参阅以下 Microsoft 网站来: 有关更多的信息请单击下面文章编号,以查看 Microsoft 知识库中相应的文章:
316510在 Internet Explorer 中使用事件处理程序时的错误: 安全异常
back to the top

属性

文章 ID:313891 - 上次审阅时间:12/07/2015 08:17:33 - 修订版本: 3.4

Microsoft Visual C# .NET 2002 标准版, Microsoft Internet Explorer 5.5

  • kbnosurvey kbarchive kbmt kbcominterop kbhowto kbhowtomaster kbsample KB313891 KbMtzh
反馈