如何: 使用松耦合事件从 Visual Studio.net

文章翻译 文章翻译
文章编号: 318185 - 查看本文应用于的产品
本文已归档。它按“原样”提供,并且不再更新。
展开全部 | 关闭全部

本文内容

概要

本逐步式指南用于创建包含一个发布服务器、 一个订户和处理在 Microsoft COM + 服务的松耦合的事件的接口的.net 程序集。

要求

下面的列表概述了建议的硬件、 软件、 网络的基础结构和服务包,您需要:
  • Microsoft Windows 2000 专业版、 Microsoft Windows 2000 Server、 Windows XP 专业,或 Windows XP 服务器中。
  • microsoft.net 框架。
  • Microsoft Visual Studio.net。
  • Microsoft Visual C#.net。
  • Microsoft COM +。
本文假定您熟悉下列主题:
  • COM 和企业服务。
  • 通过使用属性扩展元数据。

创建.net 程序集的使用松耦合的事件

下面的过程将创建包含一个发布服务器、 一个订户和句柄松散地耦合在 COM + 服务中的事件接口的.net 程序集:
  1. 单击 开始,指向 程序、 指向 Microsoft Visual Studio.net,然后单击 Microsoft Visual Studio.net
  2. 单击 新建项目
  3. 项目类型 框中,单击 Visual C# 项目
  4. 模板 中,选择 Windows 应用程序
  5. 名称 框中键入 HowToLCE,然后单击 确定

    现在,您有一个包含 Windows 窗体应用程序的外壳的解决方案。
  6. 创建包含代码的发布者、 订阅者和由两个共享界面的类库。在 文件 菜单上指向 添加项目,然后单击 新建项目
  7. 项目类型 框中,单击 Visual C# 项目
  8. 模板 中,单击 类库
  9. 名称 框中键入 ClassLibLCE,然后单击 确定
  10. 在解决方案浏览器的在 ClassLibLCE 下, 右键单击 引用,然后单击 添加引用
  11. .net 选项卡的 引用,下单击 System.EnterpriseServices,然后单击 选择。单击 确定
  12. Class1.cs 文件的顶部添加下面的 Using 指令,这些命名空间中的访问权限类:
    using System.EnterpriseServices;
    using System.Diagnostics;
    						
    时编译该 类库 组件,它将成为.net 程序集。注册它后,您可以运行它在 COM + 服务下,因为 EnterpriseServices.ServicedComponents() 从发布服务器和订阅服务器中获得。
  13. 声明将共享这两个类接口。Class1.cs 文件中公共类的 Class1 后添加以下代码:
    public interface IEvSink
    {
    	void OnEvent1();
    	void OnEvent2();
    }
    					
  14. 替换为下面的代码的发布服务器类的公共类的 Class1
    [EventClass]
    public class MyPublisher : ServicedComponent, IEvSink
    {
    	public MyPublisher()
    	{
    	// 
    	// TODO: Add constructor logic here.
    	// 
    	}
    	public void OnEvent1()
    	{}	
    	public void OnEvent2()
    	{}
    	}
    						
    公告前面的类用 [事件类] 属性修饰。此属性是至关重要的。它告诉 COM + 服务,此类窗体发布者和其 subscriber(s) 之间连接。当您已经通过本文中的所有代码时,请注意有 MyPublisher 类没有直接调用。也就在发布服务器和订阅服务器之间的交互是由 COM + 服务处理与 [事件类] 属性类。因此,发布者没有任何直接在 subscriber(s) 知道。为此应用程序使用 IEvSink 接口的 COM + 服务中注册任何订阅者可以从发布服务器接收事件。
  15. 在该类库中所需在最后一位是代码的为订阅服务器。此类处理由发行者激发该事件。在这种情况下,您在事件日志中显示对已发布的接口进行调用时通知订阅者进行一个简单的项。MyPublisher 类后添加以下代码:
    public class MySubscriber : ServicedComponent, IEvSink
    {
    	EventLog ev = new EventLog("Application");
    
    	public void OnEvent1()
    	{
    		ev.Source = "ClassLibLCE";
    		ev.WriteEntry("OnEvent1 Fired");
    	}
    
    	public void OnEvent2()
    	{
    		ev.Source = "ClassLibLCE";
    		ev.WriteEntry("OnEvent2 Fired");
    	}
    }
    					
  16. 若要用于从该类库编译该程序集赋予它强名称。若要生成此加密的密钥对,使用 $ SN 工具 (Sn.exe)。它位于 \bin 文件夹安装.net 框架软件开发工具包 (SDK) 文档的位置。SN 工具是非常易于使用。命令行语句使用以下语法:
    sn k"C:\%DirectoryToPlaceKey%\%KeyName%.snk"
  17. 在 Visual Studio.net 命令提示符下运行此命令。单击 开始,指向 程序、 指向 Microsoft Visual Studio.net、 指向 Visual Studio.net 工具,然后单击 Visual Studio.net 命令提示符。 命令提示符键入以下内容:
    sn k"C:\ClassLibLCE\key.snk"
    如果您的类库项目不在此路径中,将路径更改为您的类库项目的项目文件夹的根。

    生成一个密钥。在解决方案资源管理器登录就验证这,选择 ClassLibLCE,然后单击在 解决方案资源管理器 工具栏上的 显示所有文件 按钮。

    请注意 key.snk 的项目下 ClassLibLCE。
  18. 因为此注册表项尚未与类库程序集相关联,创建此关联。在解决方案浏览器的下 ClassLibLCE,双击 $ AssemblyInfo.cs。在 $ AssemblyKeyFile,中键入以下内容现有引号之间:
    "..\\..\\key.snk"
  19. 通过向上 Windows 窗体上,以该类库的布线完成整个解决方案的代码。请记住此表只是出于演示目的。它基本上可以作为"测试工具"。添加相应的引用。
    1. 在解决方案浏览器的在 HowToLCE 下, 右键单击 引用,,然后再单击快捷菜单上的 添加引用
    2. .net 选项卡上单击 $ System.EnterpriseServices
    3. 项目 选项卡上单击 $ ClassLibLCE
    4. 单击 选择
    5. 单击 确定

      请注意列在 $ 参照 下的 System.EnterpriseServicesClassLibLCE 项。
  20. 在代码编辑器中单击 Form1.cs [设计] 选项卡,双击来创建一个 Form1_Load 事件处理程序的窗体上的任意位置。此事件处理程序来添加下面的代码。

    请注意有两个部分。第一个是仅为注册该类库。它使用一次。第二个触发器在发布服务器的事件
    // Section #1
    // Register Class Library as a COM+ application.
        ClassLibLCE.MySubscriber l = new
        ClassLibLCE.MySubscriber ();
    
    // Section #2
    //  Call Events on Publisher
    //  ClassLibLCE.MyPublisher l = new ClassLibLCE.MyPublisher();
    //  l.OnEvent1();
    //  l.OnEvent2();
    					
  21. 按 f5 键运行该应用程序并注册该类库。

    这会使订阅服务器,可以访问,但未与 COM + 服务尚未注册。窗体加载后,请将其关闭。 这是最简单的方法,以便它可以利用 COM + 服务注册.net 程序集。 然而,在这种方式中注册您必须登录到本地计算机具有管理员权限。 如果使用您的应用程序的用户不能向他们的本地计算机的管理员权限,您可以注册程序集部署应用程序时为它们使用 Regasm.exe 实用程序。
  22. 组件服务管理单元运行。

    您不能通过使用.net 版本 1.0 中的属性设置订阅服务器。但可以通过运行组件服务管理单元手动执行这: 打开 控制面板 中,双击 管理工具,然后双击 组件服务

    : 如果您要您可以编写代码以通过使用 COM + 1.0 管理库中自动执行以下步骤。有关更多的信息查看在对象浏览器中的库内容。
  23. 展开 组件服务。展开 计算机。展开 我的电脑。展开 COM + 应用程序。展开 ClassLibLCE。展开 组件。展开 ClassLibLCE.MySubscriber
  24. 用鼠标右键单击 订阅 文件夹,指向 新建,然后再单击 订阅
  25. 在 COM + 新建订阅向导,单击 下一步。选择 订阅 IEvSink 界面 选项。单击 下一步
  26. 选择事件类 页中单击 $ ClassLibLCE.MyPublisher。(这是已用在 [事件类] 属性修饰的类。单击 下一步
  27. 输入您要使用,然后单击以选中 启用此订阅立即 复选框。单击 下一步。单击 完成

Class1.cs 文件的代码

using System;
using System.EnterpriseServices;
using System.Diagnostics;

namespace ClassLibLCE
{
       /// <summary>
       /// Summary description for Class1.
       /// </summary>
       [EventClass]
       public class MyPublisher : ServicedComponent, IEvSink
       {
	     public MyPublisher()
	     {
	     // 
	     // TODO: Add constructor logic here.
	     // 
	     }

	     public void OnEvent1()
	     {}	

	     public void OnEvent2()
	     {}
	     }

	     public class MySubscriber : ServicedComponent, IEvSink
	     {
		EventLog ev = new EventLog("Application");

		public void OnEvent1()
		{
			ev.Source = "ClassLibLCE";
			ev.WriteEntry("OnEvent1 Fired");
		}

		public void OnEvent2()
		{
			ev.Source = "ClassLibLCE";
			ev.WriteEntry("OnEvent2 Fired");
		}
	}

	public interface IEvSink
	{
		void OnEvent1();
		void OnEvent2();
	}
}
				

AssemblyInfo.cs 文件的代码

using System.Reflection;
using System.Runtime.CompilerServices;

// 
// General information about an assembly is controlled through the 
// following set of attributes. Change these attribute values to modify
// the information associated with an assembly.
// 
[assembly: AssemblyTitle("")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("")]
[assembly: AssemblyCopyright("")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]		

// 
// Version information for an assembly includes the following four 
// values:
//      Major Version
//      Minor Version 
//      Build Number
//      Revision
// 
// You can specify all the values or you can use the default Revision and 
// Build Numbers by using the '*', similar to this:

[assembly: AssemblyVersion("1.0.*")]

// 
// To sign your assembly, specify a key to use. For more 
// information about assembly signing, see the Microsoft .NET Framework 
// documentation.
// 
// Use the following attributes to control which key is used for signing. 
// 
// NOTES: 
//   (*) If no key is specified, the assembly is not signed.
//   (*) KeyName refers to a key that is installed in the Crypto Service
//       Provider (CSP) on your computer. KeyFile refers to a file that 
//       contains a key.
//   (*) If the KeyFile and the KeyName values are both specified, the 
//       following processing occurs:
//       (1) If the KeyName is found in the CSP, that key is used.
//       (2) If the KeyName does not exist and the KeyFile does exist, the 
//           key in the KeyFile is installed into the CSP and used.
//   (*) To create a KeyFile, you can use the Sn.exe (Strong Name) 
//       tool. When specifying the KeyFile, the location of the KeyFile 
//       must be relative to the project output folder which is
//       %Project Directory%\obj\<configuration>. For example, if your 
//       KeyFile is located in the project folder, specify the 
//       AssemblyKeyFile attribute as 
//          [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
//   (*) Delay Signing is an advanced option. For more information, see the 
//       Microsoft .NET Framework documentation.
// 
[assembly: AssemblyDelaySign(false)]
[assembly: AssemblyKeyFile("..\\..\\key.snk")]
[assembly: AssemblyKeyName("")]
				

Form1.cs 文件的代码

using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

namespace HowToLCE
{
	/// <summary>
	/// Summary description for Form1.
	/// </summary>
	public class Form1 : System.Windows.Forms.Form
	{
		/// <summary>
		/// Required designer variable.
		/// </summary>
		private System.ComponentModel.Container components = null;

		public Form1()
		{
			// 
			// Required for Windows Form Designer support.
			// 
			InitializeComponent();

			// 
			// TODO: Add any constructor code after the
			// InitializeComponent call.
			// 
		}

		/// <summary>
		/// Clean up any resources being used.
		/// </summary>
		protected override void Dispose( bool disposing )
		{
			if( disposing )
			{
				if (components != null) 
				{
					components.Dispose();
				}
			}
			base.Dispose( disposing );
		}

		#region Windows Form Designer generated code
		/// <summary>
		/// Required method for Designer support; do not modify
		/// the contents of this method with the Code Editor.
		/// </summary>
		private void InitializeComponent()
		{
			// 
			// Form1
			// 
			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
			this.ClientSize = new System.Drawing.Size(292, 266);
			this.Name = "Form1";
			this.Text = "Form1";
			this.Load += new System.EventHandler(this.Form1_Load);

		}
		#endregion

		/// <summary>
		/// The main entry point for the application.
		/// </summary>
		[STAThread]
		static void Main() 
		{
			Application.Run(new Form1());
		}

		private void Form1_Load(object sender, System.EventArgs e)
		{
			//Section #1
			// Register Class Library as a COM+ application.
//			ClassLibLCE.MySubscriber l = new ClassLibLCE.MySubscriber();

			//Section #2
			// Call Events on Publisher.
				ClassLibLCE.MySubscriber l = new ClassLibLCE.MySubscriber();
						l.OnEvent1();
						l.OnEvent2();
		}
	}
}
				

Works 进行验证

  1. 在代码编辑器窗口中注释代码在第 # 1 Form1.cs 文件的节和取消注释代码中部分 # 2。
  2. 运行只 HowToLCE 项目的可执行文件。 若要执行此操作在 生成 菜单上单击 配置管理器ClassLibLCE 清除 生成 复选框。单击 关闭
  3. 按 f5 键以在调试模式下运行该应用程序。
  4. 当加载窗体时,请将其关闭。
  5. 请按 CTRL + ALT + S 以启动服务器资源管理器。展开 服务器。展开 computer name。展开 事件日志。展开 应用程序。展开 ClassLibLCE

    请注意两个事件日志条目。

故障排除

  1. 刷新事件日志以查看在服务器资源管理器中的条目。
  2. 如果您对该类库通过上述过程运行之后所做的更改,然后重新生成该类库是很可能该程序集将被锁定,由组件服务。要解决此问题,使用下列方法之一:
    • 用鼠标右键单击在 组件服务 组件,然后单击 关机

      -或者-
    • 如果要对代码进行重大更改,请删除该组件。



参考

松耦合的事件有关的其他信息,请访问下面的 Microsoft 网站:
Using Loosely Coupled Events
有关如何实现和部署 COM + 的其他信息已配置的类,请访问下面的 Microsoft 网站:

属性

文章编号: 318185 - 最后修改: 2014年2月24日 - 修订: 3.3
这篇文章中的信息适用于:
  • Microsoft Visual Studio .NET 2002 专业版
  • Microsoft .NET Framework Class Libraries 1.0
关键字:?
kbnosurvey kbarchive kbmt kbhowtomaster KB318185 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 318185
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com