- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有时会遇到以下异常:无法使用与其底层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/
我正在使用 COM 互操作在使用 VS2012/.NET 4.5/Win8.1 的非托管应用程序中创建托管插件。所有互操作的东西似乎都正常,但是当我关闭应用程序时,我收到一个 MDA 异常,告诉我在释
是否可以在未知接口(interface)上增加 RCW 引用计数? (即不是底层 COM 对象的引用计数) 我有一些旧的 COM 服务器代码 int Method1(object comobject)
我有一个 gui 应用程序,它定期显示 cpu 负载。负载由 StateReader 类读取: public class StateReader { ManagementObjectSearc
引用非托管 COM 对象时,运行时可调用包装器 (RCW) 的范围是什么?根据文档: The runtime creates exactly one RCW for each COM object,
我正在尝试解决“无法使用已与其底层 RCW 分离的 COM 对象”错误的问题,我认为导致此问题的原因是 COM 对象在未实例化它们的线程上使用。 我不允许做太多的重构,并且由于对象应该在多个线程上可用
判断 COM 对象的引用计数是否已达到 0 的一种方法是尝试访问它的一个成员并捕获产生的 InvalidComObjectException,这不是很优雅,而且似乎不太适合。另一种方法是调用 Mars
Interop 和 RCW(运行时可调用包装器)有什么区别? 这只是术语吗? 最佳答案 Interop 用于调用原始 DLL 导出。 RCW(运行时可调用包装器)用于将 COM 对象暴露给 .NET
我正在尝试使用 OpcRcw.da.dll。如果我在测试控制台项目中互操作这个 dll,一切正常,但是如果我构建 dll 项目来进行互操作体操并将我的库引用到我的控制台项目中,我会收到此错误: COM
我有一些从某些 c# dll 调用的 COM 组件。 我还有一个使用该 .dll 的 winforms 应用程序。 当我关闭应用程序时出现此异常: COM object that has been s
只有有时(我还没有注意到模式),当我右键单击一个项目(各种类型的项目)并选择“特性”: 我通常在重新启动 VS2010 后可以查看项目页面。我正在使用 RTM 版本。 什么会导致此错误? 最佳答案 L
我正在进行单元测试。 我的解决方案中有 2 个项目,1 个是库项目,1 个是测试项目。库项目有一些 com 组件。测试项目正在测试库项目中的功能。这些库函数正在使用这些 com 对象。 第一个单元测试
只是想知道是否有人有足够的时间使用 WinRT 来了解 WinRT 和 .NET 4.5 中是否有一些区域会抹去 .NET 程序员在 VSTO 和 COM Interop Office 编程中遇到的与
我在我的应用程序中使用 Microsoft.Office.Interop.PowerPoint 来控制演示幻灯片。我可以使用代码连接到 PowerPoint PowerPointApp = Marsh
我正在处理大量 COM 互操作的大型多线程 C# 应用程序中工作。其他开发人员和我有足够的机会不小心调用 Single-Threaded Apartment (STA)来自 MTA 线程的 COM 对
我有时会遇到以下异常:无法使用与其底层RCW分离的COM对象 示例代码: using (AdOrganizationalUnit organizationalUnit = new AdOrganiza
我有一个使用 Office 互操作程序集的应用程序。我知道由运行时管理的“运行时可调用包装器 (RCW)”。但我不太确定引用计数是如何增加的。 MSDN 说, RCW keeps just one r
我查看了提到这个特定异常的各种问题(我访问过的 this question lists many of them)。另外,我有同样的general question as this post ,但在不
我正在订阅一个 WMI 事件并在我的应用程序关闭时收到“已与其底层 RCW 分离的 COM 对象无法使用”错误。这个问题有人问过before ,但这与我的情况完全不同。 我从我的主线程调用这段代码:
我正在处理一个项目,我需要在 C#.net 项目中调用一个非托管 COM 对象。在这个link ,我发现为了在 .net 中调用 COM 对象,需要在该对象上有一个 RC 包装器。所以,我只是想知道这
我有一个从外部 DLL 创建静态 devDrv 的 MyObject。如果 devDrv 是由 MyObject 构造函数创建的。代码工作正常。如果 devDrv 是由 MyObject.Connec
我是一名优秀的程序员,十分优秀!