1

我正在开发一个带有两个工具栏的 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 互操作有一个最小且非常理论的理解)。

4

0 回答 0