为什么我不能在 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

为什么我不能在 c# 中强制转换 com 对象

你的对象是 IPolyline 的实现,不是来自 PolylineObjClass 或 PolylineObjClass 本身的任何超类。

  • A实现IPolyline
  • B实现IPolyline
  • myFirstObj = new B();
  • mySecondObj = (A) myFirstObj; <= 失败,因为B可能会实现其他方法或属性,A不会实现,因此无法强制转换
  • mySecondObj = (IPolyline) myFirstObj; <= 工作,您将强制转换限制为相同的方法范围。