2014-09-30 186 views
1

我需要在C#中調用C++中的以下(DirectShow相關)COM接口。C#COM接口繼承

我在C#中聲明如下,但是當調用IFoo.Foo()時,它與Access Violation一起崩潰。工作正常與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 
} 

的虛函數表必須是對C++對繼承COM接口在C#不相容。有沒有辦法告訴C#遵守C++聲明?

回答

1

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 
} 

換句話說,你應該複製的IBar方法(和v表佈局)IFoo,而不是從中獲取的,以使。 NET COM interop編組很高興。在C++中也是如此,儘管在那裏使用C++繼承更自然。對於.NET COM互操作,這是必要的。

該技術被廣泛用於.NET Reference Source中,例如,爲IOleInPlaceActiveObject,它來源於IOleWindow