获取 CLR 对象 属性 引发无法转换类型 'System.__ComObject' 的 COM 对象

Getting CLR object property raises Unable to cast COM object of type 'System.__ComObject'

我试图通过反射获取 属性 的值,但最终得到以下异常:

System.Reflection.TargetInvocationException: 'Exception has been thrown by the target of an invocation.'

Inner Exception: InvalidCastException: Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Kinect.Interop.INuiColorCameraSettings'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{00A4B392-E315-470C-90B7-F7B4C3CE00C4}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

我的代码如下所示,其中 srcMicrosoft.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 returns 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()

如何在运行时通过反射获取这个属性的值?

编辑:这是抛出异常时线程 window 的样子


编辑:一直想更新这个。这里的解决方案是 运行 正确线程上的代码,在本例中是线程池中的工作线程。简单地用 Task.Run() 包装调用效果很好。这个异常(至少对我而言)并不清楚根本原因。

一直想更新这个。这里的解决方案是 运行 正确线程上的代码,在本例中是线程池中的一个 worker。简单地用 Task.Run() 包装调用效果很好。这个异常(至少对我而言)并不清楚根本原因。

我也在努力获取 System.__ComObject 的 属性 值。 最初,ComObject 是一个具有一些属性的 java 对象。 GetType() 解决方案对我不起作用,所以我进行了更多搜索,发现 TypeDescriptor 非常有用和舒适。

根据您的设置,我认为应该是:

if(TypeDescriptor.GetProperties(src).Find(propName, false) != null)
{
   propval = TypeDescriptor.GetProperties(src).Find(propName, false).GetValue(src).ToString();
}

希望对某人有所帮助。