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

C#COM服务器和客户端示例,c#,com,C#,Com,我用C#实现了带有事件的COM服务器,但不知道如何编写一个钩住事件的C#客户机。我发现了一些文章,描述了如何做C server和C++客户端,但是没有一个(或我是盲人:-p)描述了如何使用事件来做客户端。我能够连接到COM服务器对象,但不知道如何连接到事件 注意,我有两个应用程序——一个包含C#COM服务器,另一个包含C#客户端的应用程序。服务器的实现如下所示: [ComVisible(true)] [Guid("08214B02-512D-4785-9176-C4B4324FC340")] [

我用C#实现了带有事件的COM服务器,但不知道如何编写一个钩住事件的C#客户机。我发现了一些文章,描述了如何做C server和C++客户端,但是没有一个(或我是盲人:-p)描述了如何使用事件来做客户端。我能够连接到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服务器对象(我认为这并不重要)


我试图将oServer强制转换为IMyServerEvents,但这是不允许的。

正如Hans所说,如果COM引用是.NET程序集,则无法添加COM引用。您必须将其添加为普通程序集引用。您是否看过这个MSDN示例,该示例使用以下事件实现C#COM服务器:

根据该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

Play(“C:/File.txt”);如果服务器和客户机都是用C#编写的,那么使用COM毫无意义。IDE将拒绝您向服务器添加COM引用,您必须添加普通程序集引用。使用ROT只是一种绕过该限制的技巧,并不实用。不可能猜到你为什么要这样做,只是不要这样做。这也是我的理解,但我不知道如何实施我的情况下,然后。我有两个正在运行的应用程序,应用程序“A”应该控制第二个应用程序“B”。是否可以从B应用程序获得对象引用(我是C++的成员——所以我仍然使用指针:-)?
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