簡體   English   中英

通過COM到VB6實現具有事件的ac#接口

[英]Implementing a c# interface that has an event through COM to 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對象放入綁定列表中,該綁定列表將附加到列表網格視圖。 列表網格視圖需要知道其項目的屬性何時更改,以便相應地更新。

正如您所描述的, INotifyPropertyChanged主要用於屬性綁定。

具體來說,VB6控件(以及一般的ActiveX控件)大多已經內置,但它的界面不同。

您可以在其他的方式也許工作,它圓圓:你的電網接受.NET控件與INotifyPropertyChanged和ActiveX控件與INotifyPropertySink 一些相關助手可能是:

豎起大拇指!

聽起來很復雜。 也許有一種更好的方法

1)在.net上創建一個接口的實現,並使用一個模式“Active Record”para行為2)為方法創建一個包裝器后用方法簡單如何

entityChange(參數)saveChange(參數)SaveAll CancellAll

從.net你可以把事件扔到vb6(更新網格或做某事)

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

混合所有並做測試

即使使用已聲明事件的本機VB6類,也無法在VB6中實現事件。

你可以做些什么來處理這種阻抗是將一個回調接口傳遞給VB6對象並在.Net中實現一個代理,它在回調方法實現中引發你的事件。 代理顯然也需要轉發屬性/方法。

一個選項是使用標准的COM事件來處理接口,訂閱,unsubscrie等。

如果您只有一個對象,那么普通的事件/委托對將作為COM事件公開,但是對於更復雜的接口和事件,您需要創建事件接收器接口並使用以下方法將其與每個類本身關聯:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM