2016-02-22 3 views
0

Исходный код:Почему я не могу создать объект com в C#?

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, но не был обработан в пользовательском коде

Но я реализовал 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; < = работа, вы ограничены приведением к одному и тому же диапазону методов.