c# - DirectoryEntry.MoveTo 异常:由 UnsafeNativeMethods 抽象但未记录
问题描述
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 文件都没有给我任何线索。它抛出的任何异常都没有记录。
解决方案
它采用最后一个参数[out, retval] IDispatch** ppObject
并将其作为返回值,并解释返回的 HRESULT 并COMException
在需要时抛出一个。我只是还没有看到执行此操作的实际代码。
我怀疑正是这个[ComImport]
属性告诉.NET 以不同的方式对待它。
事实上,源代码确实显示了由于该属性而进行的一些特殊处理,尽管我不会假装我完全理解发生了什么。
例如,采取GetCustomMarshaledCOMObject
方法。当它返回时,它会调用GetIUnknown
并执行一些特殊的魔法false
。
该GetIUnknown
方法专门检查ComImportAttribute
并返回false
是否存在。
甚至调用的方法也GetCustomMarshaledCOMObject
说:
// Check for COMObject & do some special custom marshaling
推荐阅读
- java - db2 hit 原因:密码过期。ERRORCODE=-4214, SQLSTATE=28000 即使密码正确
- selenium - 即使在方法中有参数后,在控制台中也接收到方法的空点异常
- javascript - Azure 地图,将所有搜索结果显示为集群
- jboss - 如何在 JBOSS EAP 7 中禁用 TRACE 或更改日志级别
- amazon-web-services - 如何解决使用 Angular 上传 aws 过程中发生的错误?
- python-3.x - 识别文本文件中的 PII 数据集并对其进行加密,以便以后解密?
- jquery - OrgChart - 修改节点并添加子节点 - 使用 jquery
- javascript - Nativescript 异步函数返回对象承诺
- javascript - Electron setTimeout 在渲染器进程中返回数字而不是 Timeout 对象
- android - 在 thge Play 商店上传应用程序时严重性损坏(短信和通话记录)权限声明表