为什么我不能在 c# 中强制转换 com 对象
本文关键字:转换 com 对象 不能 为什么 | 更新日期: 2023-09-27 18:35:38
源代码:
IMoniker moniker;
int hresult = NativeMethods.CreateFileMoniker(kFileName, out moniker);
IBindCtx pbc;
NativeMethods.CreateBindCtx(0, out pbc);
Object obj;
Guid guid = new Guid();
guid = typeof(GraphicsLibrary.IPolyline).GUID;
moniker.BindToObject(pbc, null, guid, out obj);
GraphicsLibrary.IPolyline pl = (GraphicsLibrary.IPolyline)obj;
GraphicsLibrary.PolylineObjClass o = (GraphicsLibrary.PolylineObjClass)pl;
foreach (GraphicsLibrary.PolyPoint ptt in o.Points)
{
Trace.WriteLine(String.Format("point ({0}, {1})", ptt.x, ptt.y));
}
return 0;
GraphicsLibrary.PolylineObjClass o = (GraphicsLibrary.PolylineObjClass)pl;
例外
细节:
类型为"System.InvalidCastException"的异常发生在 DotNetClient.exe但未在用户代码中处理
但是我已经实现了IProvideClassInfo接口并注册了typelib。
为什么我不能投射对象?
PS:完整的源代码,请参考 https://github.com/Jichao/comtut/tree/master/monikers/FileMoniker
你的对象是 IPolyline 的实现,不是来自 PolylineObjClass 或 PolylineObjClass 本身的任何超类。
-
A
实现IPolyline
-
B
实现IPolyline
-
myFirstObj = new B();
-
mySecondObj = (A) myFirstObj;
<= 失败,因为B
可能会实现其他方法或属性,A
不会实现,因此无法强制转换 -
mySecondObj = (IPolyline) myFirstObj;
<= 工作,您将强制转换限制为相同的方法范围。