2016-02-22 48 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; < =工作,你將演員限制在相同的方法範圍內。