У меня есть COM-компонент VB6, который мне нужно вызвать из моего метода .Net. Я использую отражение, чтобы создать экземпляр COM-объекта и активировать его следующим образом:
f_oType = Type.GetTypeFromProgID(MyProgId);
f_oInstance = Activator.CreateInstance(f_oType);
Мне нужно использовать GetTypeFromProgID вместо использования tlbimp для создания библиотеки для COM DLL, так как ProgId типа, который мне нужно создать, может различаться. Затем я использую Type.InvokeMember для вызова метода COM в моем коде, например:
f_oType.InvokeMember("Process", BindingFlags.InvokeMethod, null, f_oInstance, new object[] { param1, param2, param3, param4 });
Я перехватываю все возникшие исключения TargetInvocationException для ведения журнала и могу получить подробное описание ошибки в поле TargetInvocationException.InnerException. Тем не менее, я знаю, что COM-компонент использует Error.Raise для генерации номера ошибки, и мне нужно как-то заполучить это в моем вызывающем .Net приложении.
Проблема, похоже, связана с тем, что TargetInvocationException не содержит номер ошибки, как я ожидаю, если бы это было обычное COMException, так:
Как получить номер ошибки от объекта COM в моем коде .Net?
или
Могу ли я сделать этот же вызов таким образом, чтобы вызвать COMException (содержащее номер ошибки), а не TargetInvocationException при сбое компонента COM?
Обратите также внимание на то, что целевой платформой является .Net 2.0, и у меня есть доступ к исходному коду VB6, но я бы посоветовал изменить сообщение об ошибке, выдаваемое из VB6, на код ошибки в качестве части текста взломать.