C#COM服务器和客户端示例

时间:2013-11-09 09:06:34

标签: c# com

我有使用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但不允许这样做。

1 个答案:

答案 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
相关问题