System.DirectoryServices 包含類/方法DirectoryEntry.MoveTo(..)。唯一記錄的異常是InvalidOperationException如果目標 DirectoryEntry 不是容器。我希望會有各種其他潛在的例外情況,尤其是有權限的情況下。在引擎蓋下,.MoveTo()呼叫DirectoryEntry.ContainerObject.MoveHere(this.Path, newName);DirectoryEntry新的目標位置在哪里。哪個電話:internal class UnsafeNativeMethods{ [Guid("001677D0-FD16-11CE-ABC4-02608C9E7553")] [InterfaceType(ComInterfaceType.InterfaceIsDual)] [ComImport] public interface IAdsContainer { [SuppressUnmanagedCodeSecurity] [return: MarshalAs(UnmanagedType.Interface)] object MoveHere([MarshalAs(UnmanagedType.BStr), In] string sourceName, [MarshalAs(UnmanagedType.BStr), In] string newName); ... } ...}有問題的 GUID 是指activeds.tlb類型庫。該庫定義IADsContainer.MoveHere為[id(0x00000009)]HRESULT MoveHere( [in] BSTR SourceName, [in] BSTR NewName, [out, retval] IDispatch** ppObject);斷開連接是 activeds.dll 返回一個 HRESULT,并通過 out 參數給調用者一個指向該對象的指針。但是 .NET 包裝器具有不同的簽名,并且沒有 HRESULT。兩個問題:UnsafeNativeMethods.IAdsContainer.MoveHere 如何映射到具有不同簽名的 COM 接口?HRESULT 發生了什么?關于#2...如果中間有一個對象調用 MoveHere 的 HRESULT 版本,則該對象可能會檢查結果并引發異?;蚍祷厮鼘嵗?IAdsContainer。但我不知道中間可能是什么對象,.NET 框架代碼和 .tlb 文件都沒有給我任何線索。它拋出的任何異常都沒有記錄。
1 回答

米脂
TA貢獻1836條經驗 獲得超3個贊
它采用最后一個參數[out, retval] IDispatch** ppObject
并將其作為返回值,并解釋返回的 HRESULT 并COMException
在需要時拋出一個。我只是還沒有看到執行此操作的實際代碼。
我懷疑正是這個[ComImport]
屬性告訴.NET 以不同的方式對待它。
事實上,源代碼確實顯示了由于該屬性而進行的一些特殊處理,盡管我不會假裝我完全理解發生了什么。
例如,采取GetCustomMarshaledCOMObject
方法。當它返回時,它會調用GetIUnknown
并執行一些特殊的魔法false
。
該GetIUnknown
方法專門檢查ComImportAttribute
并返回false
是否存在。
甚至調用的方法也GetCustomMarshaledCOMObject
說:
// Check for COMObject & do some special custom marshaling
- 1 回答
- 0 關注
- 211 瀏覽
添加回答
舉報
0/150
提交
取消