Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
COM+;使用c#和.NET的事件_C#_.net_Com+ - Fatal编程技术网

COM+;使用c#和.NET的事件

COM+;使用c#和.NET的事件,c#,.net,com+,C#,.net,Com+,我试图通过COM访问应用程序的某些部分,主要是因为我需要一个Delphi应用程序来调用.NET应用程序上的某些服务 我已经设法通过从ServicedComponent类继承的COM公开了一些方法,并且工作正常 现在,我需要能够向客户提出事件,以便在发生某些事情时提醒他。我现在有这样的东西: public interface IEvents { void OnMessage(); } [EventClass] [ComVisible(true)] public class MyEve

我试图通过COM访问应用程序的某些部分,主要是因为我需要一个Delphi应用程序来调用.NET应用程序上的某些服务

我已经设法通过从ServicedComponent类继承的COM公开了一些方法,并且工作正常

现在,我需要能够向客户提出事件,以便在发生某些事情时提醒他。我现在有这样的东西:

public interface IEvents
{
  void OnMessage();
}

[EventClass]    
[ComVisible(true)]
public class MyEventsClass : ServicedComponent, IEvents
{
  public void OnMessage()
  {
  }
}
public void Connect(IMyEventIface eventHandler)
{
  mEvents.Add(eventHandler);
}
但是,当我从Delphi导入TypeLibrary时,我得到以下结果:

IEvents = interface(IDispatch)
    ['{E7605303-F968-3509-829B-BF70084053C4}']
    procedure OnMessage; safecall;
  end;

IEventsDisp = dispinterface
    ['{E7605303-F968-3509-829B-BF70084053C4}']
    procedure OnMessage; dispid 1610743808;
  end;
我真的不知道怎么用。我期待一个IUnknown接口,我可以通过MyService.Register(IEEvents事件)实现并提供给服务


我想我在这里完全迷路了。。。关于如何正确地使用.NET实现COM+事件,有什么建议或参考吗?

我仍然不确定EventClass的确切用途,因为我发现您不需要使用它。我只是宣布:

[ComVisible(true)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IMyEventIface
{
}
然后,该接口作为IUnknown接口导出到Delphi

然后在ServicedComponent类上定义一个方法,该方法包含如下连接签名:

public interface IEvents
{
  void OnMessage();
}

[EventClass]    
[ComVisible(true)]
public class MyEventsClass : ServicedComponent, IEvents
{
  public void OnMessage()
  {
  }
}
public void Connect(IMyEventIface eventHandler)
{
  mEvents.Add(eventHandler);
}
这让您可以手动处理每个客户端事件处理程序的调用,但这是我找到的唯一方法