У меня есть InteropUserControl в сборке .NET, который отлично работает в других операционных системах, таких как Windows XP и Windows 2000. Моя компания продает оборудование вместе с разрабатываемым нами программным обеспечением, и мы получаем различные типы сенсорных экранов «все в одном». рабочие станции. Некоторые Все продукты одной конкретной марки, установленные с Windows Embedded для торговых точек, демонстрируют странную проблему.
На InteropUserControl я выставляю событие следующим образом:
[ComVisible( true )]
[Guid( OrdCtl.EventsId )]
[InterfaceType( ComInterfaceType.InterfaceIsIDispatch )]
public interface __IControlEvents {
[DispId( 1 )]
void ItemSelected( int someid1, int someid2 );
}
И делегат события, и главный элемент управления (включая его создание) выглядят так:
[ComVisible( false )]
public delegate void ItemSelectedEventHandler( int someid1, int someid2 );
[Guid( MyControl.ClassId )]
[ClassInterface( ClassInterfaceType.None )]
[ComSourceInterfaces( "MyInteropControl.__IControlEvents" )]
[ComClass( MyControl.ClassId, MyControl.InterfaceId, MyControl.EventsId )]
public partial class MyControl : UserControl, _IMyControl {
public const string ClassId = "... guid ...";
public const string InterfaceId = "... guid ...";
public const string EventsId = "... guid ...";
public event ItemSelectedEventHandler ItemSelected;
void OnItemSelected( int someid1, int someid2 ) {
var del = this.ItemSelected;
if ( del != null ) {
del( someid1, someid2 );
}
}
...
}
Этот элемент управления используется в приложении VB6, и обработчик событий там также, как и следовало ожидать:
Private Sub MyControl_ItemSelected(ByVal someid1 As Long, ByVal someid2 As Long)
'react to item selection event
End Sub
Однако, если машина демонстрирует некорректное поведение, событие ItemSelected
в коде элемента управления равно null
и поэтому не может быть вызвано. Поэтому я знаю , когда это не сработает, и вместо этого мог бы использовать обходной путь.
Событие корректно работает в Windows XP и Windows 2000, с .NET 2.0 Framework или .NET 3.5 Framework (проект нацелен на 2.0). У меня была одна машина с XP, демонстрирующая такое же поведение, но у нее была неудачная установка .NET 3.5. Переустановка .NET исправила эту машину. Я думал, что это было причиной, поэтому я решил переустановить на неисправных машинах.
На одной из неисправных машин с Embedded for POS я запустил установку 2.0 (ОС не поддерживается 3.5) и выбрал Repair. Это не решило проблему. Завтра утром я планирую попробовать удалить и переустановить компьютер, чтобы быть уверенным. Некоторые машины с этой ОС работают нормально, некоторые нет. Я подозреваю, что техник, который выполнял настройку этих машин, сделал что-то другое на этой последней партии машин. Информация, которую мне дали, неверна. Я проверил себя, и все машины с этой странной версией Windows демонстрируют ту же проблему.
Какие вероятные (или даже просто возможные) причины могут быть связаны с ошибкой, если событие неправильно "подключено" через COM-вызываемую оболочку? Добавлено : Как заставить его работать в Windows Embedded для торговых точек?
Я также принимаю предложения об обходных путях, надеясь услышать тот, который звучит достойно.