实现一个c#接口,通过COM到VB6有一个事件

本文关键字:COM 通过 VB6 事件 有一个 接口 一个 实现 | 更新日期: 2023-09-27 18:10:00

我有一个VB6类,需要实现我在c#中创建的接口。我已经能够在COM上成功地实现vb6类中接口的所有属性,但无法实现它所具有的事件。如果我理解正确的话,我需要定义相当于add和remove访问器的方法来注册事件的消费者,但是我不能让VB6接受定义了事件的接口。我正在将类的InterfaceType设置为InterfaceIsIDispatch,但当我尝试编译时,仍然会得到错误"实现的坏接口:方法在名称中有下划线"。接口没有定义任何方法,属性和事件都没有下划线。

下面是接口定义

namespace AV8B.Overlay
{
   [ComVisible(true)]
   [Guid("89519DCE-86D6-4962-8CEA-450F2AB31B4E")]
   public delegate void OverlaySymbolPropertyChangedEventHandler(object sender, OverlaySymbolPropertyChangedEventArgs e);
   [ComVisible(true)]
   [Guid("9A59EF10-B688-4af9-8C21-FB95C7ED699A")]
   public class OverlaySymbolPropertyChangedEventArgs : PropertyChangedEventArgs
   {
      OverlaySymbolPropertyChangedEventArgs(string propertyName) : base(propertyName) { }
   }
   [ComVisible(true)]
   [Guid("379B179C-85FA-4efb-8198-D1A4C80D645A")]
   public interface IOverlaySymbol : INotifyPropertyChanged
   {
      bool SelectedForProcessing { get; set; }
      int SymbolNumber { get; }
      string SymbolType { get; }
      double Latitude { get; }
      double Longitude { get; }
      string Color { get; }
      int Size { get; }
      /// <summary>
      /// This method fires the PropertyChanged event.
      /// </summary>
      void NotifyPropertyChanged();
      /// <summary>
      /// The event that fires when a property changes.
      /// </summary>
      new event OverlaySymbolPropertyChangedEventHandler PropertyChanged;
   }
}
这背后的目标是将实现该接口的现有VB对象放置到绑定列表中,该绑定列表将附加到列表网格视图。列表网格视图需要知道其项的属性何时发生变化,以便进行相应的更新。

实现一个c#接口,通过COM到VB6有一个事件

INotifyPropertyChanged主要用于属性绑定,正如您所描述的那样。

特别是VB6控件(和一般的ActiveX控件)已经内置了这个功能,但它是一个不同的界面。

你也许可以用另一种方式工作:你的网格接受。net控件与INotifyPropertyChanged和ActiveX控件与INotifyPropertySink。一些相关的帮助可能是:

  • 如何使用IPropertyNotifySink从c#到COM触发属性更改通知?
  • 在c#中连接COM事件-支持托管和非托管服务器

竖起大拇指!

听起来很复杂。也许一个更好的方法是

1)在。net上创建一个接口的实现,并使用一个模式如何"活动记录"para行为2)创建一个包装器后,使用方法简化如何

entityChange(参数)saveChange(参数)节约装置CancellAll

从。net你可以抛出事件到vb6(更新网格或做一些事情)

这里的例子列表http://www.elguille.info/NET/servidorNETparaCOM/servidorNETparaCOM.htm

mix all and do test

无法在VB6中实现事件,即使使用声明了事件的本地VB6类。

你能做的就是传递一个回调接口给VB6对象,并在。net中实现一个代理,在回调方法实现中引发事件。代理显然也需要转发属性/方法。

一个选项是使用标准的COM事件来处理接口,订阅,取消订阅等。

如果你只有一个对象,那么普通的事件/委托对将被暴露为COM事件,但对于更复杂的接口和事件,你需要创建你的事件接收接口,并使用

将其与每个类本身关联起来:
[System.Runtime.InteropServices.ComSourceInterfaces(typeof(ISystem_COMEventSink))]