У меня есть старый компонент COM в C ++ / ATL (Active Template Library), который использует dynamic_cast для преобразования интерфейса COM в класс C ++, который реализует интерфейс.
Если преобразование невозможно, dynamic_cast возвращает указатель NULL.
Теперь у меня есть новая реализация того же COM-интерфейса в видимом компоненте C #.
Когда оператор dynamic_cast применяется к COM-объекту из C #, я ожидаю, что он вернет NULL, но на самом деле он выдает исключение (я понятия не имею, что такое исключение).
Я, конечно, могу обернуть dynamic_cast в блок try / catch, но это нормальное поведение?
Я думаю, что MGetz дал правильную информацию.
dynamic_cast опирается на информацию о типе времени выполнения (RTTI). Это означает, что он может работать только в однородном проекте, где весь код компилируется одним и тем же компилятором (с использованием одних и тех же параметров компилятора).
Если я отключаю RTTI, я получаю
warning C4541: 'dynamic_cast' used on polymorphic type 'IMyInterfaceName' with /GR-;
unpredictable behavior may result
По сути, мы можем расширить это, сказав, что dynamic_cast в вызываемой оболочке COM (CCW) объекта C # также приводит к непредсказуемому поведению.
Лучше вообще избегать dynamic_cast.
Других решений пока нет …