Реализация интерфейса ac #, который имеет событие через COM в VB6 - PullRequest
3 голосов
/ 30 сентября 2011

У меня есть класс VB6, который должен реализовать интерфейс, который я создал в C #. Мне удалось успешно реализовать все свойства интерфейса в моем классе vb6 через COM, но я не смог реализовать событие, которое у него есть. Если я правильно понимаю, мне понадобится эквивалент средств доступа add и remove, определенных для регистрации потребителей события, но я не могу заставить VB6 принять интерфейс с определенным событием. Я устанавливаю InterfaceType класса в InterfaceIsIDispatch, но все равно получаю ошибку «Неверный интерфейс для Implements: у метода есть подчеркивание в имени», когда я пытаюсь скомпилировать. Интерфейс не определяет никаких методов, и ни свойства, ни событие не имеют подчеркивания.

Вот определение интерфейса

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 ]

1 голос
/ 01 октября 2011

INotifyPropertyChanged в основном используется с привязками свойств, как вы описали.

В частности, элементы управления VB6 (и элементы управления ActiveX в целом) в основном уже встроены, но имеют другой интерфейс.

Возможно, вы могли бы работать по-другому: ваша сетка принимает элементы управления .Net с INotifyPropertyChanged и элементы управления ActiveX с INotifyPropertySink. Некоторые соответствующие помощники могут быть:

Недурно!

0 голосов
/ 03 октября 2011

Можно использовать стандартные события COM, которые обрабатывают интерфейс, подписку, отписку и т. Д.

Если у вас есть только один объект, то обычные пары событие / делегат будут представлены как события COM, но для более сложных интерфейсов и событий вам необходимо создать свой интерфейс приемника событий и связать его с самим каждым классом, используя

[System.Runtime.InteropServices.ComSourceInterfaces(typeof(ISystem_COMEventSink))]
0 голосов
/ 30 сентября 2011

Невозможно реализовать события в VB6, даже если используется собственный класс VB6, для которого объявлены события.

Что вы можете сделать, чтобы справиться с этим сопротивлением, это передать интерфейс обратного вызова объектам VB6 и внедрить прокси в .Net, который вызывает ваши события при реализации методов обратного вызова. Прокси, очевидно, должен будет также перенаправлять свойства / методы.

0 голосов
/ 30 сентября 2011

звучит очень сложно.Возможно, один из лучших подходов будет

1) Создайте одну реализацию вашего интерфейса в .net и используйте один шаблон, как поведение «Active Record», параграф 2) После создания одной обертки для этого с методами упрощается, как

entityChange (параметры) saveChange (параметры) SaveAll CancellAll

из .net вы можете выбросить события в vb6 (для обновления сетки или сделать что-то)

здесь список примеров http://www.elguille.info/NET/servidorNETparaCOM/servidorNETparaCOM.htm

смешайте все и сделайте тест

...