2

我有用 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,但这是不允许的。

4

1 回答 1

1

正如 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
于 2014-05-23T03:54:52.603 回答