如何: 使用從 Visual Studio.NET 的鬆散結合事件

文章翻譯 文章翻譯
文章編號: 318185 - 檢視此文章適用的產品。
本文已封存。本文係以「現狀」提供且不會再更新。
全部展開 | 全部摺疊

在此頁中

結論

使用本指南將逐步建立包含一個發行者、 一個訂閱者和處理鬆散聯繫的 Microsoft COM + 服務中的事件介面的.NET 組件。

需求

下列清單列出建議的硬體、 軟體、 網路基礎結構及您需要的服務套件:
  • Microsoft Windows 2000 專業版、 Microsoft Windows 2000 Server、 Microsoft Windows XP 或 Microsoft 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 Form 應用程式的殼層的方案。
  6. 建立包含程式碼的發行者、 「 訂閱者及由兩個共用的介面的類別庫。在 [檔案] 功能表上指向 [加入專案],然後按一下 [新增專案]。
  7. 在 [專案類型,按一下 [Visual C# 專案]。
  8. 範本,] 中按一下 [類別庫]。
  9. 在 [名稱] 方塊中輸入 ClassLibLCE,],然後再按一下 [確定]]。
  10. 在 [方案總管] 之下 ClassLibLCE引用項目,] 上按一下滑鼠右鍵,然後按一下 [加入參考]。
  11. 在 [引用項目 下的 [.NET] 索引標籤上按一下 System.EnterpriseServices],再按 選取。按一下 [確定]
  12. 將下列 Using 指示詞 Class1.cs 檔案頂端加入至這些命名空間中的存取類別:
    using System.EnterpriseServices;
    using System.Diagnostics;
    						
    當您在編譯 類別庫 元件成為.NET 組件。您註冊後您可以在 [COM + 服務下執行它,因為發行者和訂閱者衍生自 EnterpriseServices.ServicedComponents()
  13. 宣告將共用目前這兩個類別介面。Class1.cs] 檔案中加入下列程式碼之後公用類別 類別 1:
    public interface IEvSink
    {
    	void OnEvent1();
    	void OnEvent2();
    }
    					
  14. 以下列的程式碼為 「 發行者 」 類別取代公用類別 類別 1:
    [EventClass]
    public class MyPublisher : ServicedComponent, IEvSink
    {
    	public MyPublisher()
    	{
    	// 
    	// TODO: Add constructor logic here.
    	// 
    	}
    	public void OnEvent1()
    	{}	
    	public void OnEvent2()
    	{}
    	}
    						
    請注意使用 [EventClass] 屬性來裝飾前述的類別。這個屬性是很重要的。它會告訴 COM + 服務這個類別會形成發行者和其 subscriber(s) 之間的連接。當您曾透過本文中的所有程式碼時,請注意是 MyPublisher 類別沒有直接呼叫。亦即發行者與訂閱者之間的互動是由 COM + 服務處理由使用 [EventClass] 屬性類別。因此,發行者並沒有任何直接的知識的 subscriber(s)。註冊為 COM + 服務 IEvSink 介面會使用這個應用程式任何訂閱者可以從發行者接收事件。
  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 Framework 軟體開發套件 (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 Form 的配線完成整個方案的程式碼。請記住這個表單只是供示範之用。它基本上會當做測試載具。新增適當的參考。
    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。(這是使用了 [EventClass] 屬性來裝飾的類別)。按一下 [下一步]。
  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();
		}
	}
}
				

請確認它的運作方式

  1. 在 [程式碼編輯器] 視窗註解程式碼中的 Form1.cs 檔案區段 # 1,然後取消註解程式碼區段 # 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 Professional Edition
  • Microsoft .NET Framework Class Libraries 1.0
關鍵字:?
kbnosurvey kbarchive kbmt kbhowtomaster KB318185 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本: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