我有使用C#实现的事件的COM服务器,并且不知道如何编写挂钩事件的C#客户端。我找到了几篇文章描述了如何做C#服务器和C ++客户端但没有(或者我是盲目的:-P)描述了如何使用事件来做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 :(得分:0)
正如汉斯所说,如果它是.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