簡體   English   中英

C#COM接口繼承

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM