首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# COM接口继承

C# COM接口继承
EN

Stack Overflow用户
提问于 2014-09-30 00:32:52
回答 1查看 872关注 0票数 1

我在C++中有以下(与C++相关的) COM接口,需要在C#中调用它。

代码语言:javascript
运行
复制
[uuid("...")] : public IUnknown
interface IBar
{
    STDMETHOD(Bar)(void);
}

[uuid("...")]
interface IFoo : public IBar
{
    STDMETHOD(Foo)(void);
}

我在C#中声明了这一点,如下所示,但是当调用IFoo.Foo()时,它会崩溃而导致访问冲突。但是,IBar.Bar()可以很好地工作。用C#编写等效接口的正确方法是什么?

代码语言:javascript
运行
复制
[ComImport, Guid("...)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[SuppressUnmanagedCodeSecurity]
public interface IBar
{
    [PreserveSig] int Bar(); // Calling this is OK
}

[ComImport, Guid("...)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[SuppressUnmanagedCodeSecurity]
public interface IFoo : IBar
{
    [PreserveSig] int Foo(); // Calling this crashes
}

对于继承的COM接口,在C#和C++中,vtable必须是不兼容的。有什么方法可以告诉C#坚持C++声明吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-02 11:53:21

您的C# IFoo声明应该如下所示:

代码语言:javascript
运行
复制
[ComImport, Guid("...)]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[SuppressUnmanagedCodeSecurity]
public interface IFoo
{
    [PreserveSig] int Bar(); // Calling this is OK
    [PreserveSig] int Foo(); // Calling this should also be OK
}

换句话说,您应该为IBar复制IFoo的方法(和v表布局),而不是从中派生,以使.NET COM互操作封送处理程序高兴。这在C++中也是可能的,尽管在那里使用C++继承更自然。然而,对于.NET COM互操作来说,这是必要的。

这一技术在.NET参考源中得到了广泛的应用,例如IOleInPlaceActiveObject,它是从IOleWindow派生的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26110947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档