none
在 COM interop 中 C# 接口的继承问题 RRS feed

  • 问题

  • 以 IPersist、IPersistFolder、IPersistFolder2 三个接口为例。起初我是利用继承来定义他们的,即是:

    interface IPersist
    {
        int GetClassID([Out] out Guid pClassID);
    }
    
    interface IPersistFolder : IPersist
    {
        int Initialize([In] PCIDL pidl);
    }
    
    interface IPersistFolder2 : IPersistFolder
    {
        int GetCurFolder([Out] out PIDL ppidl);
    }

    如果是这样定义的话,interop 的时候, shell 就会崩溃。后来我将每个接口中应该有的方法全部声明一遍,而取消了接口间的继承,就如 C style vtable 那样,即是:

    interface IPersist
    {
        int GetClassID([Out] out Guid pClassID);
    }
    
    interface IPersistFolder
    {
        // IPersist
        int GetClassID([Out] out Guid pClassID);
    
        // IPersistFolder
        int Initialize([In] PCIDL pidl);
    }
    
    interface IPersistFolder2
    {
        // IPersist
        int GetClassID([Out] out Guid pClassID);
    
        // IPersistFolder
        int Initialize([In] PCIDL pidl);
    
        // IPersistFolder2
        int GetCurFolder([Out] out PIDL ppidl);
    }

    这样 interop 才能顺利进行。

    这个究竟是什么原因呢?是 C# 在 interop 方面必须要这样定义?这样子好麻烦啊。

    2013年7月26日 16:00

答案

全部回复