Я пытаюсь получить значение свойства с помощью отражения, но в итоге получаю следующее исключение:
System.Reflection.TargetInvocationException: 'Исключение было сгенерировано целью вызова.'
Внутреннее исключение:
InvalidCastException: невозможно преобразовать COM-объект типа «System .__ ComObject» в тип интерфейса «Microsoft.Kinect.Interop.INuiColorCameraSettings». Эта операция завершилась неудачно, поскольку вызов QueryInterface для компонента COM для интерфейса с IID '{00A4B392-E315-470C-90B7-F7B4C3CE00C4}' завершился ошибкой из-за следующей ошибки: такой интерфейс не поддерживается (Исключение из HRESULT: 0x80004002 (E_NOINTERFACE)) .
Мой код выглядит следующим образом: src
- это Microsoft.Kinect.ColorCameraSettings
, а propName = "Brightness"
:
var prop = src.GetType().GetProperty(propName);
if (prop != null)
{
return prop.GetValue(src, null);
}
Я также попробовал предположительно более удобный для COM метод, но с той же проблемой:
return src.GetType().InvokeMember(propName, System.Reflection.BindingFlags.GetProperty, null, src, null);
Самое интересное, что нечего предположить, что src
является COM-объектом:
src.GetType().IsCOMObject
возвращает false
Но из трассировки стека внутренних исключений видно, что объект src внутренне взаимодействует с COM-объектом.
at System.StubHelpers.StubHelpers.GetCOMIPFromRCW(Object objSrc, IntPtr pCPCMD, IntPtr& ppTarget, Boolean& pfNeedsRelease)
at Microsoft.Kinect.Interop.INuiColorCameraSettings.GetBrightness(Double& pBrightness)
at Microsoft.Kinect.NuiColorCameraSettings.GetBrightness()
at Microsoft.Kinect.ColorCameraSettings.get_Brightness()
Как я могу получить значение этого свойства с помощью отражения во время выполнения?
Edit: вот как выглядит окно Threads, когда выдается исключение
РЕДАКТИРОВАТЬ: имел в виду обновить это. Решение здесь состоит в том, чтобы запустить код в правильном потоке, который в этом случае является рабочим из пула потоков. Простое завершение вызова Task.Run()
работает хорошо. Исключение (по крайней мере для меня) не очень ясно о первопричине.