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 デベロッパー センターを参照してください。Sync Framework での Event Tracing for Windows (ETW) インフラストラクチャに対するサポートについては、「Sync Framework コンポーネントのトレース」を参照してください。
Sync Framework 2.0 をインストールしても以前にインストールしたバージョンがアップグレードされない
Sync Framework 2.0 をインストールしても、以前にインストールした CTP バージョンの Sync Framework は削除もアップグレードもされません。
解決方法
最終リリース バージョンをインストールする前に、すべての CTP バージョンの Sync Framework 2.0 をアンインストールします。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 を再インストールします。Sync Framework は、Microsoft Web サイトからダウンロードできます。
マネージ アプリケーションで System.Runtime.InteropServices.COMException (0x80004002) がスローされる
マネージ同期アプリケーションで、System.Runtime.InteropServices.COMException がスローされ、次のエラー メッセージが表示されます。"型 'Sync Framework Managed Class' の COM オブジェクトをインターフェイス型 'Sync Framework COM Interop Class' にキャストできません。IID '{73EA794F-1251-4466-A19C-DAEAF5BDBD04}' が指定されたインターフェイスの COM コンポーネント上での QueryInterface 呼び出しのときに次のエラーが発生したため、この操作に失敗しました: インターフェイスがサポートされていません (HRESULT からの例外: 0x80004002 (E_NOINTERFACE))。"
この例外は、シングル スレッド アパートメントで Sync Framework オブジェクトが作成され、そのオブジェクトのメソッドが、別のシングル スレッド アパートメントから呼び出された場合に発生します。この場合、.NET Framework は、Sync Framework オブジェクトに IMarshal インターフェイスを照会することによって、一方のアパートメントからもう一方のアパートメントへと Sync Framework オブジェクトをマーシャリングしようと試みます。Sync Framework オブジェクトには、IMarshal が実装されていないため、呼び出しは失敗し、この例外が発生します。
解決方法
マルチスレッド アパートメント (MTA) スレッドを使用します。MTA スレッドの場合、マーシャリングは不要です。
64 ビット バージョンの Windows オペレーティング システムでデバッグしているときに不正確なスタック情報が表示される
64 ビット バージョンの Windows オペレーティング システムでは、スタック情報が失われ、デバッガーで正しく表示されません。
この問題は、マネージ コンポーネントでアンマネージ コンポーネントに移行するような例外がスローされた後、同じアンマネージ コンポーネントで、再びマネージ コンポーネントに移行するような例外がスローされると発生します。この場合、64 ビット バージョンの Windows オペレーティング システムでは、.NET Framework がスタック情報を正しく維持しません。Sync Framework のマネージ コンポーネントは、.NET Framework の COM 相互運用機能を使用してアンマネージ コンポーネントをラップするため、特定のマネージ コンポーネントで例外がスローされると、この問題が発生します。
この問題の具体的な例としては、FeedSync フィードを作成するマネージ同期アプリケーションがあります。このマネージ アプリケーションには、例外をスローする FeedIdConverter メソッドが実装されています。この例外は、Sync Framework の基になるアンマネージ コンポーネントに対してスローされた後、再びマネージ アプリケーションのコードに戻されます。この時点で、デバッガーのスタック トレースには、例外の発生源が正しく表示されなくなります。
解決方法
このケースでは、スタック情報が正しく維持されないため、カスタム例外をスローして、例外の種類だけでその発生源を特定できるようにするなど、他のデバッグ手法を用いる必要があります。
Sync Framework で GetChangeBatch 呼び出しが繰り返され無限ループに陥る
同期中、Sync Framework は、IsLastBatch (マネージ コードの場合) で true が返されるか、ISyncChangeBatchBase::GetIsLastBatch (アンマネージ コードの場合) で TRUE が返されるような変更バッチを受け取るまで、GetChangeBatch (マネージ コードの場合) または IKnowledgeSyncProvider::GetChangeBatch (アンマネージ コードの場合) を繰り返し呼び出します。
解決方法
プロバイダーは、最後の変更バッチを返す前に、SetLastBatch (マネージ コードの場合) または ISyncChangeBatchBase::SetLastBatch (アンマネージ コードの場合) を使用して、そのバッチを最後のバッチとしてマークする必要があります。