Получение свойства объекта CLR вызывает невозможность приведения объекта COM типа 'System .__ ComObject' - PullRequest
0 голосов
/ 16 марта 2019

Я пытаюсь получить значение свойства с помощью отражения, но в итоге получаю следующее исключение:

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, когда выдается исключение enter image description here


РЕДАКТИРОВАТЬ: имел в виду обновить это. Решение здесь состоит в том, чтобы запустить код в правильном потоке, который в этом случае является рабочим из пула потоков. Простое завершение вызова Task.Run() работает хорошо. Исключение (по крайней мере для меня) не очень ясно о первопричине.

1 Ответ

0 голосов
/ 01 апреля 2019

Имеет смысл обновить это.Решение здесь состоит в том, чтобы запустить код в правильном потоке, который в этом случае является рабочим из пула потоков.Простая упаковка вызова с помощью Task.Run () работает хорошо.Исключение (по крайней мере для меня) не очень ясно в отношении основной причины.

...