[英]C# COM Interface Inheritance
我有以下C ++中与DirectShow相关的COM接口,需要在C#中调用。
[uuid("...")] : public IUnknown
interface IBar
{
STDMETHOD(Bar)(void);
}
[uuid("...")]
interface IFoo : public IBar
{
STDMETHOD(Foo)(void);
}
我在C#中声明了以下内容,但是在调用IFoo.Foo()时,它因访问冲突而崩溃。 可以与IBar一起正常工作,但是会调用Bar()。 用C#编写等效接口的正确方法是什么?
[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接口,vtable在C#与C ++中必须不兼容。 有没有办法告诉C#遵守C ++声明?
您的IFoo
C#声明应如下所示:
[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
}
换句话说,您应该为IFoo
复制IBar
方法(和v-表布局),而不是从中继承,以使.NET COM互操作编组器感到高兴。 尽管在C ++中使用C ++继承更为自然,但在C ++中也可以做到这一点。 对于.NET COM互操作,这是必需的。
.NET参考源中广泛使用了此技术,例如IOleInPlaceActiveObject (它是从IOleWindow
派生的)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.