2016-02-22 13 views
0

源代码:为什么我不能在c#中投射com对象?

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;

详情:

类型的例外,则 '' 发生在 DotNetClient.exe但在用户代码中没有处理

但我已经实施了IProvideClas sInfo接口并且注册了typelib。

为什么我不能施放对象?

PS:完整的源代码,请参阅https://github.com/Jichao/comtut/tree/master/monikers/FileMoniker

回答

3

你的目标是IPolyline的实现和不来自PolylineObjClass或PolylineObjClass本身的任何超类。

  • A实现IPolyline
  • B实现IPolyline
  • myFirstObj = new B();
  • mySecondObj = (A) myFirstObj; < =失败,因为B力量实现其他方法或属性A没有,所以不可能投
  • mySecondObj = (IPolyline) myFirstObj; < =工作,你将演员限制在相同的方法范围内。