我有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,但它是不允許的。
oServer.Play(「C:/File.txt」);沒問題 –
當使用C#編寫服務器和客戶端時,使用COM沒有任何意義。 IDE將拒絕讓您向服務器添加COM引用,您必須添加常規程序集引用。使用ROT只是圍繞這個限制的破解,這不是一個實際的限制。不可能猜測你爲什麼這樣做,只是不要這樣做。 –
這也是我的理解,但我不知道如何實施我的情況。我有兩個正在運行的應用程序,應用程序「A」應該控制第二個應用程序「B」。是否有可能從B應用程序獲取對象引用(我是C++的人 - 所以我仍然使用指針:-)並從A中調用方法? – user2971473