gpt4 book ai didi

c# - 无法使用与其底层 RCW 分离的 COM 对象 - 为什么会发生这种情况?

转载 作者:太空狗 更新时间:2023-10-29 23:19:27 25 4
gpt4 key购买 nike

我有时会遇到以下异常:无法使用与其底层RCW分离的COM对象

示例代码:

using (AdOrganizationalUnit organizationalUnit = new AdOrganizationalUnit(ADHelper.GetDirectoryEntry(ouAdDn))) 
{
using (AdUser user = organizationalUnit.AddUser(commonName))
{
//set some properties
user.Properties[key].Add(value);

user.CommitChanges();

user.SetPassword(password); //it is set using Invoke

//must be set after creating user
user.Properties["UserAccountControl"].Value = 512;

user.CommitChanges();

}
}

AdUser 看起来像这样:

public class AdUser : DirectoryEntry 
{
public AdUser(DirectoryEntry entry)
: base(entry.NativeObject)
{
}

public bool SetPassword(string password)
{
object result = this.Invoke("SetPassword", new object[] { password });
return true;
}
}

这是我的代码的简化版本。异常有时会出现,有时不会。大多数情况下,它发生在我尝试设置 UserAccountControl 值时。有谁知道可能是什么原因?

我发现当我处理用于创建 AdUser 的 DirectoryEntry 并且我仍在尝试使用 AdUser 对象时会发生此错误。但是,上面发布的代码并非如此。 DirectoryEntry 是否有可能以某种方式自行处置?

当我尝试对许多事件目录对象执行操作时,我也会遇到此异常。例如,当我尝试为一千个用户设置 SecurityDescriptor 时,每 200-300 个用户就会出现此错误。当我在建立新连接后重试操作时,我没有遇到异常。消息是检测到 raceonrcwcleanup。我的应用不是多线程的。

如有任何帮助,我们将不胜感激。

最佳答案

是的,DirectoryEntry 对象可能由于垃圾回收而被释放。 GC 在它自己的线程中运行,因此 RCW 清理上的竞争是可能的。

尝试在您的 AdUser 对象中保存对它的引用。 IE。它应该看起来像

public class AdUser : DirectoryEntry 
{
DirectoryEntry entry;
public AdUser(DirectoryEntry entry) : base(entry.NativeObject)
{
this.entry = entry;
}
...
}

关于c# - 无法使用与其底层 RCW 分离的 COM 对象 - 为什么会发生这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1492879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com