Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
MarshalDirectiveException при вызове метода через COM-interop wrapper
|
|||
|---|---|---|---|
|
#18+
Попросили тут разобраться с вызовом метода одного достаточно специфичного и проприетарного COM-компонента, и я наткнулся на загадочную фигню. Этот метод в IDL выглядит так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. причем интерфейс не дуальный. Когда я добавляю этот COM-компонент в референсы проекта, то в сгенерённой студией сборке COM-interop враппера у этого метода такая сигнатура: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Пытаюсь дернуть этот метод с использованием этого COM-interop враппера: Код: c# 1. 2. - и получаю исключение на вызове GenerateFromHTML: Код: plaintext которое, согласно документации , выбрасывается в случае наличия в сигнатуре неправильного атрибута MarshalAs для какого-либо аргумента. Вызываю этот же метод через поднее связывание: Код: c# 1. 2. - отрабатывает нормально. Почему не получается вызвать метод через COM-interop враппер? Студия его неправильно сгенерила? Как в таком случае он должен выглядеть? Может, дело в самом компоненте? В глаза бросается, что метод вместо общепринятого в COM HRESULT (в IDL) возвращает VARIANT (который, кстати, при вызове через позднее связывание ничего не содержит - равен null). А Powershell при вызове этого метода вообще падает с ошибкой FullyQualifiedErrorId : MethodNotFound. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2020, 09:21 |
|
||
|
MarshalDirectiveException при вызове метода через COM-interop wrapper
|
|||
|---|---|---|---|
|
#18+
Сделал тест: сляпал нативный COM-компонент вот с таким интерфейсом: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. и подцепил его в референсы проекта. Создался COM-interop враппер вот с такими методами: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. - сигнатуры абсолютно идентичны, за исключением того, что у Zot еще добавлен MethodImplOptions.PreserveSig. Ну, и тест: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. Код: plaintext 1. 2. 3. 4. 5. 6. - видимо, действительно, COM-методы, возвращающие не HRESULT, дают вот такой эффект. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.06.2020, 15:20 |
|
||
|
MarshalDirectiveException при вызове метода через COM-interop wrapper
|
|||
|---|---|---|---|
|
#18+
Из документации : A return type is compatible with Automation if its type is an HRESULT, SCODE or void. However, MIDL requires that interface methods return either HRESULT or SCODE. Returning void generates a compiler error. Получается-таки, что да, у исходного компонента интерфейс не подходит для автоматизации/маршаллинга. Tlbimp могла бы об этом предупреждать (проверил с ключом /verbose - ничего не говорит про этот нюанс). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.06.2020, 07:09 |
|
||
|
|

start [/forum/topic.php?fid=20&msg=39970039&tid=1398530]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
48ms |
get topic data: |
14ms |
get forum data: |
3ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 295ms |
| total: | 436ms |

| 0 / 0 |
