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

时间:2011-09-29 22:08:07

标签: c# events com interface vb6

我有一个VB6类需要实现我在C#中创建的接口。我已经能够通过COM成功实现我的vb6类中的接口的所有属性,但是无法实现它具有的事件。如果我理解正确,我将需要相应的添加和删除访问器定义为注册事件的使用者,但我不能让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对象放入绑定列表中,该绑定列表将附加到列表网格视图。列表网格视图需要知道其项目的属性何时更改,以便相应地更新。

4 个答案:

答案 0 :(得分:1)

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

具体来说,VB6控件(以及一般的ActiveX控件)大多已经内置,但它的界面不同。

您也许可以反过来使用它:您的网格接受带有INotifyPropertyChanged的.Net控件和带有INotifyPropertySink的ActiveX控件。一些相关的帮助者可能是:

竖起大拇指!

答案 1 :(得分:0)

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

1)在.net上创建一个接口实现,并使用一个模式“Active Record”para行为 2)用方法简单创建一个包装器后如何

entityChange(参数) saveChange(参数) 保存全部 CancellAll

来自.net的

你可以将事件抛给vb6(用于更新网格或做某事)

此处示例列表http://www.elguille.info/NET/servidorNETparaCOM/servidorNETparaCOM.htm

混合所有并进行测试

答案 2 :(得分:0)

即使使用已声明事件的本机VB6类,也无法在VB6中实现事件。

您可以采取的措施是将回调接口传递给VB6对象,并在.Net中实现代理,以便在回调方法实现中引发事件。代理显然也需要转发属性/方法。

答案 3 :(得分:0)

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

如果您只有一个对象,那么正常的事件/委托对将作为COM事件公开,但是对于更复杂的接口和事件,您需要创建事件接收器接口并使用以下方法将其与每个类本身关联:

[System.Runtime.InteropServices.ComSourceInterfaces(typeof(ISystem_COMEventSink))]