我在C++中有以下(与C++相关的) 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接口,在C#和C++中,vtable必须是不兼容的。有什么方法可以告诉C#坚持C++声明吗?
发布于 2014-10-02 11:53:21
您的C# IFoo
声明应该如下所示:
[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
派生的。
https://stackoverflow.com/questions/26110947
复制相似问题