|
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=39970234&tid=1398530]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
281ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
77ms |
get tp. blocked users: |
2ms |
others: | 248ms |
total: | 655ms |
0 / 0 |