Как вы создаете экземпляр IDispatchEx в C#?

это мой первый ТАК вопрос! Я хотел бы создать экземпляр COM-объекта и привести его к IDispatchEx, чтобы я мог перечислить его элементы. Вот пример:

    Type _COMType = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
    var _COMObject = (IDispatchEx)Activator.CreateInstance(_COMType);

Мой IDispatchEx идентичен тому, который на этом сайте (не мой веб-сайт), за исключением того, что GetNextDispID и GetMemberName возвращают целое число (которое я хочу использовать для HRESULT, как описано в MSDN).

Пример выше не работает. Есть ли способ создать экземпляр COM-объектов, как если бы активные сценарии приводились к интерфейсу IDispatchEx?

Спасибо за любую помощь/предложения!


person aikeru    schedule 29.04.2011    source источник


Ответы (2)


Эта операция завершилась неудачно, так как вызов QueryInterface компонента COM для интерфейса с IID "{A6EF9860-C720-11D0-9337-00A0C90DCAA9}" завершился сбоем из-за следующей ошибки: такой интерфейс не поддерживается (исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .

Сообщение об исключении, которое вы получаете, ясно как звоночек: Scripting.FileSystemObject просто не реализует интерфейс IDispatchEx. Только IDispatch. Это отлично работает:

        Type t = System.Type.GetTypeFromProgID("Scripting.FileSystemObject");
        var obj = Activator.CreateInstance(t);
        var iobj = (stdole.IDispatch)obj;

Готово, вы не можете заставить компонентный класс COM реализовать интерфейс. Я бы не ожидал, что очень многие классы COM реализуют его, IDispatchEx довольно неясен. Он соответствует шаблону JScript.

person Hans Passant    schedule 30.04.2011
comment
Спасибо, Ханс. Кажется, что также невозможно перечислить свойства/методы с помощью IDispatch. Возможно, мне придется пойти другим путем... - person aikeru; 03.05.2011
comment
Возвращаясь к этому - я был неправ :) Вполне возможно перечислить члены с помощью IDispatch для COM-объектов с поздней привязкой (которые его реализуют). Я все еще многому учусь. - person aikeru; 18.06.2012

Похоже, вам нужно будет определить этот интерфейс самостоятельно, если вы хотите использовать его в C# (источник)

Эта тема может быть актуально - похоже, кто-то нашел для использования существующую реализацию IDispatchEx.

person Justin    schedule 29.04.2011