我正在开发一个带有两个工具栏的 Windows 资源管理器扩展(我没有编写原始代码),它使用了此处找到的 IPersistStream 和 BandObject 的定义。当我使用 VS 2010 附加到资源管理器时,出现以下错误:
托管调试助手“InvalidMemberDeclaration”在“C:\WINDOWS\explorer.exe”中检测到问题。
附加信息:确定如何封送类型为“BandObjectLib.IPersistStream”的成员“Save”的参数时发生以下错误:System.Runtime.InteropServices.MarshalDirectiveException:无法封送“返回值”:托管/非托管类型组合无效(Int /UInt 必须与 SysInt 或 SysUInt 配对)。这很可能是由于其中一个参数的 MarshalAs 属性不兼容。
我认为这意味着 C# 方法签名之间存在一些不匹配:
//(no PersistSig)
void Save([In, MarshalAs(UnmanagedType.Interface)] IntPtr pStm, [In, MarshalAs(UnmanagedType.Bool)] bool fClearDirty);
以及 IPersistStream::Save 的预期签名:
HRESULT Save(
[in] IStream *pStm,
[in] BOOL fClearDirty
);
该方法在实现类中的实现如下所示:
public virtual void Save(IntPtr pStm, bool fClearDirty) {}
一个完整的答案会很好,但是关于我如何调试和解决这个问题的任何想法也会有所帮助(请记住,我对 COM 互操作有一个最小且非常理论的理解)。