[英]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.