获取 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)).
我的代码如下所示,其中 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
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();
}
希望对某人有所帮助。
我试图通过反射获取 属性 的值,但最终得到以下异常:
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)).
我的代码如下所示,其中 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
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();
}
希望对某人有所帮助。