Мы обязаны использовать сторонний элемент управления ActiveX.
Единственная проблема заключается в том, что уровень нашего программного обеспечения является бизнес-уровнем и не имеет доступа к окну или форме. Он также работает в отдельных потоках (и должен работать из любого потока), которые не являются STA.
Вместо того, чтобы нарушать наше отделение пользовательского интерфейса от бизнес-логики, мы использовали этот обходной путь, чтобы заставить его работать:
Thread thread = new Thread((ThreadStart)
delegate
{
_myActiveX = new MyActiveXType();
_myActiveX.CreateControl();
//more initialize work
Application.Run();
});
thread.SetApartmentState(ApartmentState.STA);
thread.IsBackground = true;
thread.Start();
Тогда в любое время, когда нам нужно сослаться на элемент управления, мы вызываем _myActiveX.BeginInvoke()
или Invoke()
.
Утилизируя этот класс (выходя из нашего приложения), мы удаляем элемент управления и прерываем поток.
Мой вопрос: есть ли проблемы с этим? Есть ли лучший способ справиться с этим?
Существует ли лучший встроенный способ работы с элементом управления ActiveX из неизвестной многопоточной среды? Мы пытаемся написать наш класс таким образом, чтобы обернуть элемент управления, но он будет работать из любого потока.
ОБНОВЛЕНИЕ: Как подсказал ответ, мы действительно предпочли бы использовать стандартный объект COM и вообще не использовать элемент управления. Наша проблема с этим заключалась в том, что мы получили бы ошибку «(Исключение из HRESULT: 0x8000FFFF (E_UNEXPECTED)» при первом методе или свойстве, которое мы вызываем для объекта COM. Это довольно общая ошибка, которую мы не получаем при использовании ActiveX есть идеи?
ОБНОВЛЕНИЕ: Наш ocx - "CX25.ocx", с помощью tlbimp.exe мы получаем CX25Lib.dll. Используя aximp.exe, мы получаем AxCX25Lib.dll и CX25Lib.dll. CX25Lib.dll не работает ни в одном случае. AxCX25Lib.dll работает.