2013-11-09 86 views
0

我有COM服務器在C#中實現的事件,不知道如何編寫一個C#客戶端掛鉤到事件。我發現了幾篇描述如何做C#服務器和C++客戶端的文章,但沒有一篇文章(或者我是盲人:-P)描述瞭如何使用事件來完成C#客戶端。我能夠連接到COM服務器對象,但不知道如何掛鉤事件。C#COM服務器和客戶端示例

注意我有兩個應用程序 - 一個包含C#COM服務器和另一個包含C#客戶端的應用程序。

[ComVisible(true)] 
[Guid("08214B02-512D-4785-9176-C4B4324FC340")] 
[InterfaceType(ComInterfaceType.InterfaceIsDual)] 
public interface IMyServer 
{ 
    bool Play(string sFile); 
} 

[ComVisible(true)] 
[Guid("141CAAEA-63CE-422E-BF00-BAF4DBEEA77A")] 
[InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] 
public interface IMyServerEvents 
{ 
    [DispId(1)] 
    event OnPlayFinishedHandler OnPlayFinished; 
} 

[ComVisible(true)] 
[ProgId("MyApp.MyServer")] 
[Guid("D184855D-E425-46A6-9171-34C828353778")] 
[ComSourceInterfaces(typeof(IMyServerEvents))] 
[ClassInterface(ClassInterfaceType.None)] 
public class MyServer : IMyServer, IDisposable 
{ 
    public MyServer() 
    { 
    } 

    [ComVisible(false)] 
    public delegate void OnPlayFinishedHandler(); 
    public event OnPlayFinishedHandler OnPlayFinished; 

    public bool Play(string sFile) 
    { 
     if (OnPlayFinished != null) 
      OnPlayFinished(); 

     return true; 
    } 
} 

現在的客戶,我通過運行對象表(並不重要,我認爲這裏是如何)獲得COM服務器對象:服務器執行如下。

IMyServer oServer = GetServer(); 

// TODO: Connect to OnPlayFinised event 

oServer.Play("C://File.txt"); 

我試圖將oServer轉換爲IMyServerEvents,但它是不允許的。

+0

oServer.Play(「C:/File.txt」);沒問題 –

+0

當使用C#編寫服務器和客戶端時,使用COM沒有任何意義。 IDE將拒絕讓您向服務器添加COM引用,您必須添加常規程序集引用。使用ROT只是圍繞這個限制的破解,這不是一個實際的限制。不可能猜測你爲什麼這樣做,只是不要這樣做。 –

+0

這也是我的理解,但我不知道如何實施我的情況。我有兩個正在運行的應用程序,應用程序「A」應該控制第二個應用程序「B」。是否有可能從B應用程序獲取對象引用(我是C++的人 - 所以我仍然使用指針:-)並從A中調用方法? – user2971473

回答

0

正如Hans所說,如果它是一個.NET程序集,則不能添加COM引用。您必須將其添加爲常規裝配參考。您是否看到過使用事件實現C#COM服務器的MSDN示例: http://msdn.microsoft.com/en-us/library/dd8bf0x3(v=vs.90).aspx

從該MSDN示例開始,您將在C#客戶端應用程序中添加該C#程序集作爲參考。要掛鉤COM服務器引發的事件,您需要編寫事件處理程序,然後訂閱該事件。此示例代碼參考上面的MSDN示例。

public void ClickEventHandler(int x, int y) 
{ 
    // The "Click" event was raised on the COM server, handle the event here 
} 

EventSource.Button myButton = new EventSource.Button(); 
myButton.Click += new EventSource.ClickDelegate(ClickEventHandler); // subscribe to the event