Динамическая загрузка элементов управления ActiveX из CLSID
Я анализирую какой-то сторонний программный "скрипт", который генерирует форму графического интерфейса на основе его содержимого, и я хочу прочитать скрипт в программе на C# и произвести похожий вывод, вот пример скрипта:
BEGIN SECTION Intro
BACKPICTURE=xxxx.gif
PICTUREPOSN=Center
BEGIN CONTROL CLI
IS RADIO=NO
CLSID={49EBC3A3-727D-11CF-9BB9-080000001311}
POSITION=(24,16,250,45)
QUESTION=@0:232
BEGIN PROPERTY Title
DISPID=2
SETTING=CLI :
TYPE=BSTR
END PROPERTY
BEGIN PROPERTY Arrangement
DISPID=3
SETTING=1
TYPE=I4
END PROPERTY
BEGIN PROPERTY EditBoxLength
DISPID=4
SETTING=3
TYPE=I4
END PROPERTY
Интересующие меня свойства BEGIN CONTROL
а также BEGIN PROPERTY
поскольку они указывают на начало элемента управления ActiveX и его свойства.
Мой вопрос: как мне загрузить этот элемент управления ActiveX по его CLSID и установить его свойства? Type.GetTypeFromCLSID
кажется, что я хочу, и он не выдает никаких исключений, когда я использую Activator.CreateInstance(Type)
так что это должно быть создание действительного экземпляра, но как бы один из них задал свойства, а затем "нарисовал" этот элемент управления в форме Windows?
Благодарю.
1 ответ
Это сложно в.NET. Элемент управления ActiveX требует оболочки, чтобы дать ему гостеприимный дом. Эта оболочка реализована классом AxHost. К сожалению, вы не можете использовать этот класс непосредственно в коде, его конструкторы защищены. Он был разработан для использования инструментом AxImp.exe. Этот инструмент автоматически генерирует класс.NET, производный от AxHost. Полученный класс затем легко использовать в качестве элемента управления. Проблема в том, что этот инструмент нужно запускать заранее, пока вы создаете свою форму. Это никогда не проблема, кроме как здесь.
Лучшее, что вы можете сделать, - это создать оболочки с AxImp для любого элемента управления ActiveX, который вы когда-либо найдете в этом скрипте. Вероятно, это будет ограниченное подмножество. Затем попросите интерпретатора сценариев выбрать правильную оболочку на основе clsid. Чтобы сделать это динамически, как вы и предполагали, вам нужно создать свою собственную оболочку. AxHost, однако, не маленький класс, и хостинг ActiveX довольно неприятен со многими деталями, о которых нужно позаботиться.