Такая проблема: нужно создать COM coclass который может менять свой дефолтный интерфейс от инстанциации к инстанциации. При этом достаточно предоставить только дисп интерфейс.
Я не смог найти способа в явную перекрыть Invoke у IDispatch судя по всему .NET не одобряет такие реализации, однако для моей задачи это было-бы наиболее приемлемым решением.
Здравствуйте, aksenov_a.s, Вы писали:
AS>Я не смог найти способа в явную перекрыть Invoke у IDispatch судя по всему .NET не одобряет такие реализации, однако для моей задачи это было-бы наиболее приемлемым решением.
ComImportAttribute
Как можно перекрыть IDispatch используя C#
От:
Аноним
Дата:
22.12.04 11:53
Оценка:
Invoke на C# перекрыть нельзя, поскольку IDispatch and IUnknown реализуются неявно by ComInterop. Да и вообще динамически изменять интерфейс вредно, непонятно, как клиент будет с ним обращаться. Может, достаточно определить для вашего класса фабричный метод типа IDispatch GetMyCustomIDispatch( ) и возвращать одну из готовых реализаций?
или используйте C++ managed extentions...
Здравствуйте, Аноним, Вы писали:
А>Invoke на C# перекрыть нельзя, поскольку IDispatch and IUnknown реализуются неявно by ComInterop. Да и вообще динамически изменять интерфейс вредно, непонятно, как клиент будет с ним обращаться. Может, достаточно определить для вашего класса фабричный метод типа IDispatch GetMyCustomIDispatch( ) и возвращать одну из готовых реализаций?
Очень жаль, что так сделать нельзя, я надеялся что такая возможность настройки предоставлена. Прийдется действительно писать вручную. А использовать предложенный метод с MyCustomDispatch неполучается из-за условий задачи — я не знаю на момент компиляции какие методы и свойства нужно будет предоставить. Эта информация становится доступной только на момент создания экземпляра.
А>или используйте C++ managed extentions...
А>данное сообщение получено с www.gotdotnet.ru А>ссылка на оригинальное сообщение
Re: Как можно перекрыть IDispatch используя C#
От:
Аноним
Дата:
22.12.04 12:14
Оценка:
>>>использовать предложенный метод с MyCustomDispatch неполучается из-за условий задачи — я не знаю на момент компиляции какие методы и свойства нужно будет предоставить. Эта информация становится доступной только на момент создания экземпляра.
в этом случае все не так безнадежно: есть два варианта
1 — сложный — создать класс в Runtime при помощи Emitting Dynamic Assemblies
2 — заранее создать класс реализующий все возможные методы( или содержащий заглушки)
во время запроса определить какие из них необходимы для IDispatch, проставить у них атрибуты dispid и вызвать Marshal.GetIDispatchForObject
Здравствуйте, Аноним, Вы писали:
>>>>использовать предложенный метод с MyCustomDispatch неполучается из-за условий задачи — я не знаю на момент компиляции какие методы и свойства нужно будет предоставить. Эта информация становится доступной только на момент создания экземпляра.
А>в этом случае все не так безнадежно: есть два варианта А>1 — сложный — создать класс в Runtime при помощи Emitting Dynamic Assemblies
Это сложно и очень не удобно, поскольку я не знаю даже примарно какие методы и с какими декларациями будут, вообще мне просто нужно повторить интерфейс переданного класса, но с другой логикой работы.
А>2 — заранее создать класс реализующий все возможные методы( или содержащий заглушки) А>во время запроса определить какие из них необходимы для IDispatch, проставить у них атрибуты dispid и вызвать Marshal.GetIDispatchForObject
> Invoke на C# перекрыть нельзя, поскольку IDispatch and IUnknown реализуются неявно by ComInterop.
Это почему же нельзя? Сам не делал, но в теории ничего тебе не мешает его реализовать самому
Posted via RSDN NNTP Server 1.9 delta
Народная мудрось
всем все никому ничего(с).
Re: Как можно перекрыть IDispatch используя C#
От:
Аноним
Дата:
22.12.04 14:11
Оценка:
>>Это почему же нельзя? Сам не делал, но в теории ничего тебе не мешает его реализовать самому
из этой теории имеются два исключения: IDispatch and IUnknown
то есть реализовать эти интерфейсы можно, только через ComInterop эти реализации видны не будут....
Здравствуйте, aksenov_a.s, Вы писали:
AS> Я не смог найти способа в явную перекрыть Invoke у IDispatch судя по всему .NET не одобряет такие реализации, однако для моей задачи это было-бы наиболее приемлемым решением.
Можно реализовать IDispatchEx, он как раз предназначен для подобного.
Здравствуйте, AndrewVK, Вы писали:
AVK>Здравствуйте, aksenov_a.s, Вы писали:
AS>> Я не смог найти способа в явную перекрыть Invoke у IDispatch судя по всему .NET не одобряет такие реализации, однако для моей задачи это было-бы наиболее приемлемым решением.
AVK>Можно реализовать IDispatchEx, он как раз предназначен для подобного.
CCW вызывает метода через Reflection. Вряд ли она узнает о таком интерфейсе, как IDispatchEx. Нужно пометить тип атрибутом IDispatchImplAttribute
Здравствуйте, Mika Soukhov, Вы писали:
MS>CCW вызывает метода через Reflection. Вряд ли она узнает о таком интерфейсе, как IDispatchEx.
Она и не должна знать. Об этом интерфейсе должен знать клиент. Это стандартная СОМ-овская механика.
MS> Нужно пометить тип атрибутом IDispatchImplAttribute
Если нет возможности менять клиентов, то согласен.
Hello, "AndrewVK"
> AS> Я не смог найти способа в явную перекрыть Invoke у IDispatch судя по всему .NET не одобряет такие реализации, однако для моей задачи это было-бы наиболее приемлемым решением. > > Можно реализовать IDispatchEx, он как раз предназначен для подобного.
И как IDispatchEx поможет в смене Default IDispatch интерфейса?
Posted via RSDN NNTP Server 1.9 alpha
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.
Тут одна идея пришла. IDispatch нельзя перекрыть потому, что CCW реализует его автоматически используя reflection. Но делает он это только, если ему явно указать, что класс должен реализовать IDispatch.
Можно попробовать самостоятельно определить interface IDispatch, затем реализовать его у некоторого класса, после чего сказать Marshal.GetIUnknownForObject( ), то есть стандартной реализации IDispatch не произойдет, и, возможно, проскочит наша кастомная.