【发布时间】:2011-02-26 12:47:33
【问题描述】:
我试图了解从 C# 代码实现 COM 接口的正确原因是什么。当接口不从其他基本接口继承时,这很简单。喜欢这个:
[ComImport, Guid("2047E320-F2A9-11CE-AE65-08002B2E1262"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IShellFolderViewCB
{
long MessageSFVCB(uint uMsg, int wParam, int lParam);
}
然而,当我需要实现一个从其他 COM 接口继承的接口时,事情就开始变得奇怪了。例如,如果我实现 IPersistFolder2 接口,该接口继承自 IPersistFolder,而 IPersist 继承自 IPersist,就像我通常在 C# 代码中一样:
[ComImport, Guid("0000010c-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersist
{
void GetClassID([Out] out Guid classID);
}
[ComImport, Guid("000214EA-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistFolder : IPersist
{
void Initialize([In] IntPtr pidl);
}
[ComImport, Guid("1AC3D9F0-175C-11d1-95BE-00609797EA4F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IPersistFolder2 : IPersistFolder
{
void GetCurFolder([Out] out IntPtr ppidl);
}
操作系统无法调用我的对象实现的方法。当我调试时,我可以看到我的IPersistFolder2 实现的构造函数被调用了很多次,但是我实现的接口方法没有被调用。我正在执行IPersistFolder2 如下:
[Guid("A4603CDB-EC86-4E40-80FE-25D5F5FA467D")]
public class PersistFolder: IPersistFolder2
{
void IPersistFolder2.GetClassID(ref Guid classID) { ... }
void IPersistFolder2.Initialize(IntPtr pidl) { ... }
void IPersistFolder2.GetCurFolder(out IntPtr ppidl) { ... }
}
奇怪的是,当我如下声明 COM 接口导入时,它起作用了:
[ComImport, Guid("0000010c-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IPersist
{
void GetClassID([Out] out Guid classID);
}
[ComImport, Guid("000214EA-0000-0000-C000-000000000046"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IPersistFolder : IPersist
{
new void GetClassID([Out] out Guid classID);
void Initialize([In] IntPtr pidl);
}
[ComImport, Guid("1AC3D9F0-175C-11d1-95BE-00609797EA4F"), InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
internal interface IPersistFolder2 : IPersistFolder
{
new void GetClassID([Out] out Guid classID);
new void Initialize([In] IntPtr pidl);
void GetCurFolder([Out] out IntPtr ppidl);
}
我不知道当我以这种方式声明 COM 接口时它为什么会起作用(使用 new 隐藏基本接口方法)。也许这与 IUnknown 的工作方式有关。有谁知道在 C# 中实现继承自其他 COM 接口的 COM 接口的正确方法是什么?为什么?
【问题讨论】:
-
投票支持你向我展示如何“导入”IPersist。 stackoverflow.com/questions/1253368/… 使用它,但没有提及如何添加对它的引用。
-
我遇到了同样的问题,并且能够使用“新”关键字修复它。感谢@Hans Passant :)