Использование ActiveX контрола не в форме, а в классе

Рейтинг: 2Ответов: 1Опубликовано: 19.04.2015

Есть ActiveX контрол, предоставляющий определенный функционал.

Есть ли возможность в .NET использовать его не в форме, а в классе\статическом классе?

Т.е. не требуется его визуальное отображение, нужна лишь его механика.

Пробовал подобным образом вызывать его из класса: (myControl as Control).CreateControl();

сами понимаете - ничего путного. NullReferenceException.

update

Немого покопался, использовав оболочку Ax пытаюсь создать объект (т.е. уже без as): myControl.CreateControl();

Выдает исключение: "Данный элемент управления ActiveX является неоконным и не поддерживается в этой версии .NET Framework." (System.InvalidOperationException)

update 2

Нашел похожую проблему с контролом ActiveX: ссылка

Там тема заглохла. Есть ли еще варианты?

update 3

Тестовый проект на базе RDP Client контрола: ссылка

Ответы

▲ 2Принят

Скрытая форма - единственный вариант. Ошибка, которую вы получаете, в английском варианте звучит как Unable to get window handle, Windowless ActiveX controls are not supported - "ActiveX вне форм не поддерживаются".

ActiveX задумывался прежде всего как фреймворк для визуальных элементов. Поэтому вся ифраструктура для них просто не работает, пока контрол не будет помещен на форму.

Можно скрестить пальцы и вызвать CreateControl у наследника AxHost:

public static void SomeMethod()
{
    var axSkype1 = new AxSKYPE4COMLib.AxSkype();
    axSkype1.CreateControl();

    Debug.WriteLine(axSkype1.RecentChats.Count);
}

нужны будут референсы на AxSomeLib, SomeLib и System.Windows.Forms если повезет - будет работать. Но все равно будут некоторые ограничения на поток, в котором это можно сделать.