问题标签 [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.
c# - 我们可以使用反射来读取 COM 对象属性信息吗?
我们可以使用反射来读取 COM 对象属性信息吗?
我正在尝试使用以下代码获取 COM 对象的属性名称和值。
但它失败了。
这里的连接是我的 COM 对象。
谁能帮我吗?
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 中:
而在我的主要:
我还能做些什么来避免我得到的错误吗?
c# - 静态 C# 对象原因:无法使用已与其底层 RCW 分离的 COM 对象
我有一个从外部 DLL 创建静态 devDrv 的 MyObject。如果 devDrv 是由 MyObject 构造函数创建的。代码工作正常。如果 devDrv 是由其中一个 MyObject.Connect 创建的(请参见下面的第二个对象),则第一次调用 MyObject.Connect() 可以正常工作。在第二次调用时,我会收到此错误:“无法使用已与其底层 RCW 分离的 COM 对象”。似乎 devDrv 不是持久的。我希望这个 devDrv 对象由 MyObject.Connect 创建,如下面的第二个对象所示。我会感谢你的帮助。
c++ - c++ - 无法使用已与其底层 RCW 分离的 COM 对象
我的问题是标题中的错误消息:
我试图用谷歌搜索它,但我只能找到与析构函数/释放对象相关的解决方案。这不是我想做的事情。
首先,这是我的代码:
简而言之:我有一个选中的列表框,这部分代码在选择了必要的东西后运行。在选中列表框中列出了 Excel 工作簿的不同工作表。我正在尝试根据选中列表框中的所选项目从工作簿中选择工作表。
在最后一行代码 (exWss = safe_cast (exApp->ActiveWorkbook->Sheets[p]);) 我收到了上述错误消息。
我已经看到元帅释放会导致这样的问题。在另一个函数中,虽然我运行 Marshal.Releasecomobject,但它是完全分离的,没有它我也会得到相同的错误。
任何想法,将不胜感激。
c# - 在 64 位应用程序中使用 32 位互操作 dll
我对使用 64 位进程的 32 位互操作 dll 有点困惑。为了访问 8TB 内存,我将为 64 位构建我的应用程序,不幸的是它使用了一些以 32 位模式构建的统计互操作库。我没有这个库的资源,所以我无法将它重建为 64 位。
在本文中,建议创建 64 位代理进程,该进程将使用 IPC(例如 WCF)与我的应用程序进行通信。在这里,我们可以找到使用 Runtime Callable Wrapper ( RCW ) 的解决方案。哪个更好?我开始实施代理流程,就在今天我找到了第二个解决方案,我不知道它是否适合我的需求。
我需要提一下,这个统计互操作库有数百个接口和类。我仍然只需要其中一些。我已经开始创建将其中几个作为端点托管的 WCF 服务,看起来这将是很多代码/工作。
我可以使用第二种方法 (RCW) 与互操作 dll 一起使用吗?
问候,乔特贝克
c# - 如何让 LINQPad 转储() System.__ComObject 引用?
我正在尝试使用LINQPad快速开发小型ArcObjects ( ESRI 的 ArcGIS软件的基于 COM 的库)应用程序,并且在将它用于我从 .NET 初始化的 COM 对象的属性方面取得了一些成功Dump()
,但任何 COM 对象从现有的 COM 对象中获取的对象被简单地转储为System.__ComObject
引用,这并不是特别有用:
这个帮助主题解释了为什么会发生这种情况,我想我理解,但想知道有哪些选项可以解决这种行为,特别是在使 LINQPad(甚至)更强大的情况下。
有趣的是,Visual Studio 的调试器能够显示这些对象的属性,甚至是值类型的值:
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 方法。
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 互操作的工作方式,这是可能的还是无法启动?
com - 发布版本引入了 COM 对象的错误
我有一个类库,我在其中使用OutlookStorage.cs来阅读(Outlook .msg)电子邮件和该电子邮件中的附件。我使用自定义文档查看器打开每个附件,该查看器将附件中的任何内容转换为 PDF。在调试模式下,这完美地工作。在发布模式下,读取 1 个附件后,会引发 COM 异常,指出“无法使用已与其底层 RCW 分离的 COM 对象”。
使发布构建工作的属性是: 1. 必须禁用优化代码。2. 在 Advanced Build Settings 中,Debug Info 设置必须设置为 Full。
我试图通过添加如下属性来禁用该方法的优化:
但是,如果仍然启用了发布模式设置的优化代码选项,这并没有什么不同。
这是从 COM 对象读取流的代码:
_attachments 是一个通用列表,OpenInNewDialog 在文档打开后返回(无需等待用户干预)。
有没有人可以对此有所了解?我可以在代码中做些什么来防止发布版本引入这个错误吗?
.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 文件)
可能是什么原因,或者我在这里做错了什么?
.net - COM RCW - ActiveX 组件无法创建对象
我有一个 COM 组件 - “ProgramA.dll” 这个 COM 组件在内部引用“ProgramB.dll”,并创建一个底层对象的实例,如下所示:
我在我的 .NET 应用程序中添加了 ProgramA.dll 的引用(并且还在 .NET 应用程序中添加了 ProgramB 的引用)。
当我通过我的 .NET 应用程序调用 ProgramA 的“AddData()”方法时,它在尝试创建 ProgramB.clsClassA 的实例时失败,它给出了一个错误,提示“AcitveX 组件无法创建对象”
可能的原因是什么,或者我需要做哪些更改?