问题标签 [rcw]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
256 浏览

c# - 我们可以使用反射来读取 COM 对象属性信息吗?

我们可以使用反射来读取 COM 对象属性信息吗?

我正在尝试使用以下代码获取 COM 对象的属性名称和值。

但它失败了。

这里的连接是我的 COM 对象。

谁能帮我吗?

0 投票
2 回答
12620 浏览

c# - 如何避免 RCW 清理比赛

我有一个 gui 应用程序,它会定期显示 cpu 负载。负载由 StateReader 类读取:

gui 使用响应式扩展进行更新:

现在当我退出我的应用程序时,我收到一条错误消息

如果我不读取 cpu 负载,则不会出现此错误,而只是提供一些随机值,因此该错误以某种方式与读取负载有关。此外,如果我在之后放置一个断点Application.Run(gui)并在那里稍等片刻,错误似乎不会经常出现。

从这个和我的谷歌搜索来看,我认为使用管理命名空间中的类会创建一个后台线程,该线程引用包装在运行时可调用包装器中的 COM 对象,并且当我退出我的应用程序时,该线程没有时间正确关闭RCW,导致我的错误。这是正确的,我该如何解决这个问题?


我已经编辑了我的代码以反映我得到的响应,但我仍然得到同样的错误。代码更新了三点:

  • StateReader 是可处置的,在 Dispose 方法中处置其 ManagementObjectSearcher,并在我的 main 方法中 Application.Run 之后对 StateReader 对象调用 Dispose
  • 在 CPULoad 中,我处理了 ManagementCollection 和其中的每个 ManagementObject
  • 在我的主要方法中,我在 gui 上的 FormClosing
    上的事件处理程序中处理订阅对象。这应该确保关闭后不会为 gui 生成任何事件。

代码的相关部分现在位于 StateReader 中:

而在我的主要:

我还能做些什么来避免我得到的错误吗?

0 投票
1 回答
358 浏览

c# - 静态 C# 对象原因:无法使用已与其底层 RCW 分离的 COM 对象

我有一个从外部 DLL 创建静态 devDrv 的 MyObject。如果 devDrv 是由 MyObject 构造函数创建的。代码工作正常。如果 devDrv 是由其中一个 MyObject.Connect 创建的(请参见下面的第二个对象),则第一次调用 MyObject.Connect() 可以正常工作。在第二次调用时,我会收到此错误:“无法使用已与其底层 RCW 分离的 COM 对象”。似乎 devDrv 不是持久的。我希望这个 devDrv 对象由 MyObject.Connect 创建,如下面的第二个对象所示。我会感谢你的帮助。

0 投票
1 回答
494 浏览

c++ - c++ - 无法使用已与其底层 RCW 分离的 COM 对象

我的问题是标题中的错误消息:

我试图用谷歌搜索它,但我只能找到与析构函数/释放对象相关的解决方案。这不是我想做的事情。

首先,这是我的代码:

简而言之:我有一个选中的列表框,这部分代码在选择了必要的东西后运行。在选中列表框中列出了 Excel 工作簿的不同工作表。我正在尝试根据选中列表框中的所选项目从工作簿中选择工作表。

在最后一行代码 (exWss = safe_cast (exApp->ActiveWorkbook->Sheets[p]);) 我收到了上述错误消息。

我已经看到元帅释放会导致这样的问题。在另一个函数中,虽然我运行 Marshal.Releasecomobject,但它是完全分离的,没有它我也会得到相同的错误。

任何想法,将不胜感激。

0 投票
1 回答
4432 浏览

c# - 在 64 位应用程序中使用 32 位互操作 dll

我对使用 64 位进程的 32 位互操作 dll 有点困惑。为了访问 8TB 内存,我将为 64 位构建我的应用程序,不幸的是它使用了一些以 32 位模式构建的统计互操作库。我没有这个库的资源,所以我无法将它重建为 64 位。

本文中,建议创建 64 位代理进程,该进程将使用 IPC(例如 WCF)与我的应用程序进行通信。在这里,我们可以找到使用 Runtime Callable Wrapper ( RCW ) 的解决方案。哪个更好?我开始实施代理流程,就在今天我找到了第二个解决方案,我不知道它是否适合我的需求。

我需要提一下,这个统计互操作库有数百个接口和类。我仍然只需要其中一些。我已经开始创建将其中几个作为端点托管的 WCF 服务,看起来这将是很多代码/工作。

我可以使用第二种方法 (RCW) 与互操作 dll 一起使用吗?

问候,乔特贝克

0 投票
1 回答
1883 浏览

c# - 如何让 LINQPad 转储() System.__ComObject 引用?

我正在尝试使用LINQPad快速开发小型ArcObjects ( ESRI 的 ArcGIS软件的基于 COM 的库)应用程序,并且在将它用于我从 .NET 初始化的 COM 对象的属性方面取得了一些成功Dump(),但任何 COM 对象从现有的 COM 对象中获取的对象被简单地转储为System.__ComObject引用,这并不是特别有用:

LINQPad 截图

这个帮助主题解释了为什么会发生这种情况,我想我理解,但想知道有哪些选项可以解决这种行为,特别是在使 LINQPad(甚至)更强大的情况下。

有趣的是,Visual Studio 的调试器能够显示这些对象的属性,甚至是值类型的值:

Visual Studio 调试 ArcObjects

Visual Studio 使用什么机制来实现这种自省,为什么 LINQPad 的 Dump 方法不做同样的事情?编辑:请参阅有关 VS 如何执行此操作的相关问题:Visual Studio 的调试器/交互式窗口如何在 .NET 中转储 COM 对象的属性?

ArcObjects .NET SDK包括带有 RCW的PIA,每个 CoClass 可以实现 COM 接口,因此我认为应该可以以编程方式包装这些对象。

作为一种解决方法Marshal.CreateWrapperOfType(),当我碰巧知道应该使用哪个 CoClass 时,我已在我的 LINQ 查询中成功使用强制 LINQPad 转储对象的属性。当然,这只会正确地转储值类型属性——任何基于 COM 的引用类型属性仍报告为System.__ComObject,因此正确的解决方案必须递归地工作以将这些属性也包装起来。

上一个问题中,我了解到 CoClass 可以在运行时确定,如果它实现IPersist,ArcObjects 的很大一部分就是这样做的。我可以以某种方式使用这种技术或另一种技术来自动System.__ComObject从 PIA 强制 a 到适当的 RCW 吗?如果是这样,我如何在 LINQPad 中实现它,例如通过提供ICustomMemberProvider实现?是否可以将其设为递归,以便同时包装 COM 对象的属性?

我正在使用面向 .NET 4.0 的 LINQPad 4.x,但我也对支持 LINQPad 2.x 感兴趣(因此,首选适用于 .NET 3.5 和 .NET 4.0 的解决方案,但这不是必需的)。

更新:我已经弄清楚了问题的第一部分,即如何System.__ComObject使用IPersist.GetClassID. 有关我正在使用的代码,请参阅此相关问题此答案。

我仍然想知道如何将其用于 LINQPad 的 Dump 方法。

0 投票
2 回答
1600 浏览

c# - 如何从 CLSID 中获取 Runtime Callable Wrapper 类的 System.Type?

注意:有关背景信息,请参阅此相关问题:How to get LINQPad to Dump() System.__ComObject references?

可以使用IPersist.GetClassID().

Type.GetTypeFromCLSID()总是返回弱类型System.__ComObject而不是强类型 RCW 类。

我需要获取System.Type强类型 RCW 类的 ,以便能够使用它来包装 COM 对象Marshal.CreateWrapperOfType()

由于 COM 互操作的工作方式,这是可能的还是无法启动?

0 投票
0 回答
64 浏览

com - 发布版本引入了 COM 对象的错误

我有一个类库,我在其中使用OutlookStorage.cs来阅读(Outlook .msg)电子邮件和该电子邮件中的附件。我使用自定义文档查看器打开每个附件,该查看器将附件中的任何内容转换为 PDF。在调试模式下,这完美地工作。在发布模式下,读取 1 个附件后,会引发 COM 异常,指出“无法使用已与其底层 RCW 分离的 COM 对象”。

使发布构建工作的属性是: 1. 必须禁用优化代码。2. 在 Advanced Build Settings 中,Debug Info 设置必须设置为 Full。

我试图通过添加如下属性来禁用该方法的优化:

但是,如果仍然启用了发布模式设置的优化代码选项,这并没有什么不同。

这是从 COM 对象读取流的代码:

_attachments 是一个通用列表,OpenInNewDialog 在文档打开后返回(无需等待用户干预)。

有没有人可以对此有所了解?我可以在代码中做些什么来防止发布版本引入这个错误吗?

0 投票
1 回答
1027 浏览

.net - 'COMSVCSLib.ObjectControl' 类型在未引用的程序集中定义

  • 我有两个 VB 6 程序集 (DLL)。ProgramA.dll 和 ProgramB.dll,我需要将它们作为参考添加到我的 .NET Web 服务(2.0 版)中。
  • 我被不同的开发人员交给了这两个 DLL。
  • 一位开发人员简单地给了我 ProgramA.dll
  • 另一个开发人员给了我 ProgramB.dll、ProgramB.exp 和 ProgramB.lib
  • 我只是使用 regsvr32 注册了 ProgramA.dll 并在我的 .NET 项目中添加了它的引用
  • 然后我在我的 .NET 项目中添加了 ProgramB.dll 的引用

  • 现在,当我尝试构建我的 .NET Web 服务时,它给了我以下错误:“COMSVCSLib.ObjectControl”类型是在未引用的程序集中定义的。我可以在 .NET 应用程序的参考中看到以下文件:COMSVCSLib Interop.COMSVCSLib Interop.ProgramA Interop.ProgramB

此外,代码显示 ProgramB 程序集的问题(我有那些 .exp 和 .lib 文件)

可能是什么原因,或者我在这里做错了什么?

0 投票
1 回答
182 浏览

.net - COM RCW - ActiveX 组件无法创建对象

我有一个 COM 组件 - “ProgramA.dll” 这个 COM 组件在内部引用“ProgramB.dll”,并创建一个底层对象的实例,如下所示:

我在我的 .NET 应用程序中添加了 ProgramA.dll 的引用(并且还在 .NET 应用程序中添加了 ProgramB 的引用)。

当我通过我的 .NET 应用程序调用 ProgramA 的“AddData()”方法时,它在尝试创建 ProgramB.clsClassA 的实例时失败,它给出了一个错误,提示“AcitveX 组件无法创建对象”

可能的原因是什么,或者我需要做哪些更改?