实现一个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对象放置到绑定列表中,该绑定列表将附加到列表网格视图。列表网格视图需要知道其项的属性何时发生变化,以便进行相应的更新。
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))]