ここにある IPersistStream と BandObject の定義を使用する、2 つのツールバー (元のコードは作成していません) を備えた Windows エクスプローラー拡張機能に取り組んでいます。VS 2010 を使用して Explorer に接続すると、次のエラーが発生します。
マネージ デバッグ アシスタント 'InvalidMemberDeclaration' は、'C:\WINDOWS\explorer.exe' で問題を検出しました。
追加情報: タイプ 'BandObjectLib.IPersistStream' のメンバー 'Save' のパラメーターをマーシャリングする方法を決定しているときに、次のエラーが発生しました: System.Runtime.InteropServices.MarshalDirectiveException: '戻り値' をマーシャリングできません: 無効なマネージド型とアンマネージド型の組み合わせ (Int /UInt は、SysInt または SysUInt と組み合わせる必要があります)。これは、パラメーターの 1 つで互換性のない 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 相互運用性について最小限かつ非常に理論的な理解を持っていることに注意してください)。