Sync Framework 故障排除
本主题列出了针对您在使用 Sync Framework 时可能发生的以下常见问题的解决办法:
安装 Sync Framework 2.0 不升级以前安装的版本
托管应用程序引发 System.Runtime.InteropServices.COMException (0x80040154)
托管应用程序引发 System.Runtime.InteropServices.COMException (0x80004002)
当您在 64 位版本的 Windows 操作系统上进行调试时,堆栈信息不正确
Sync Framework 在无限循环中重复调用 GetChangeBatch
有关此处未列出的问题的更多故障排除帮助信息,请参见 Sync Framework developer center(Sync Framework 开发人员中心)。有关针对 Windows 事件跟踪 (ETW) 基础结构的 Sync Framework 支持信息,请参见跟踪 Sync Framework 组件。
安装 Sync Framework 2.0 CTP 不升级以前安装的版本
安装 Sync Framework 2.0 时,不删除或升级以前安装的 Sync Framework 的 CTP 版本。
解决办法
在安装最终发行版之前,卸载 Sync Framework 2.0 的所有 CTP 版本。Sync Framework 2.0 可以与 Sync Framework 1.0 并行安装。
托管应用程序引发 System.Runtime.InteropServices.COMException (0x80040154)
托管同步应用程序引发 System.Runtime.InteropServices.COMException 并显示以下错误消息:“对 CLSID 为 {565AEDBF-3108-4405-AF1F-9C2C25925DAE} 的组件检索 COM 类工厂的过程由于以下错误而失败:80040154。”
当安装中缺失非托管同步组件(如 Synchronization.dll)时,发生此异常。当卸载了 Sync Framework 或安装未成功完成时,可能发生此问题。
解决办法
重新安装 Sync Framework。可以从此 Microsoft 网站下载 Sync Framework。
托管应用程序引发 System.Runtime.InteropServices.COMException (0x80004002)
托管同步应用程序引发 System.Runtime.InteropServices.COMException 并显示以下错误消息:无法将类型为“Sync Framework 托管类”的 COM 对象转换为接口类型“Sync Framework COM 互操作类”。此操作之所以失败,其原因为:对于 IID 为“{73EA794F-1251-4466-A19C-DAEAF5BDBD04}”的接口,针对 COM 组件进行 QueryInterface 的调用由于以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE))。
当在一个单线程单元中创建 Sync Framework 对象而从另一个单线程单元中调用此对象的方法时,将发生此异常。在此情况下,.NET Framework 将尝试通过查询 IMarshal 接口的 Sync Framework 对象,将 Sync Framework 对象从一个单元封送到另一个单元。Sync Framework 对象不实现 IMarshal,因此调用将失败并引发此异常。
解决办法
使用多线程单元 (MTA) 线程。MTA 线程不要求进行封送处理。
当您在 64 位版本的 Windows 操作系统上进行调试时,堆栈信息不正确
在 64 位版本的 Windows 操作系统上,堆栈信息丢失并且在调试器中错误地显示此信息。
当某个托管组件引发一个转向某个非托管组件的异常,然后此非托管组件回过来向某托管组件引发该异常时,将发生此问题。在此情况下,.NET Framework 不会在 64 位版本的 Windows 操作系统上正确地保留堆栈信息。因为 Sync Framework 的托管组件通过使用 .NET Framework 的 COM 互操作功能包装非托管组件,所以,当某些托管组件引发异常时,将发生此情景。
此问题的具体示例为一个生成 FeedSync 馈送的托管同步应用程序。此托管应用程序实现 FeedIdConverter 方法,该方法将引发一个异常。将向 Sync Framework 的基础非托管组件引发此异常,然后回过来向托管应用程序代码引发此异常。此时,调试器中的堆栈跟踪将错误地显示异常的来源。
解决办法
因为在此情况下无法正确地保留堆栈信息,所以您必须使用其他调试策略(例如,引发一个自定义异常,以便只需根据异常的类型就能确定异常的来源)。
Sync Framework 在无限循环中重复调用 GetChangeBatch
在同步过程中,Sync Framework 重复调用 GetChangeBatch(对于托管代码)或 IKnowledgeSyncProvider::GetChangeBatch(对于非托管代码),直到它收到从 IsLastBatch(对于托管代码)返回 TRUE 的变更批,或收到从 ISyncChangeBatchBase::GetIsLastBatch(对于非托管代码)返回 true 的变更批。
解决办法
在提供程序返回最后一个变更批之前,它必须使用 SetLastBatch(对于托管代码)或 ISyncChangeBatchBase::SetLastBatch(对于非托管代码)将该批标记为最后一个批。