问题标签 [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# - Visual Studio OrderedTests:无法使用已与其底层 RCW 分离的 COM 对象
首先,这里使用的技术包括:Visual Studio、C#、Selenium WebDriver、Google Chrome 和 MS Excel。
我正在构建一个自动化框架来测试多个 Web 应用程序。我正在使用 Excel 电子表格来提取可变数据,以便其他测试人员可以更轻松地使用测试。在我们的冒烟测试期间,我们运行了几个我按顺序构建的单元测试。因此,我认为创建有序测试是个好主意。单独运行每个测试时,它们工作得很好。但是,一旦我开始运行有序测试,列表中的第一个测试将运行,但随后出现此错误:
System.Runtime.InteropServices.InvalidComObjectException:无法使用已与其基础 RCW 分离的 COM 对象。
我在一个名为 ReadFile 的类中创建了对我的 Excel 电子表格的引用:
当我的测试通过或失败时,它们会调用 CleanUp 方法,该方法包括退出 chromedriver 并调用 ReadFile.Close() 方法:
我做了很多研究,发现可能需要调用 Mashall.FinalReleaseComObject。我也尝试过使用它,但似乎没有什么不同。我还注意到 Excel 进程在第一次测试完成后继续运行几秒钟。所以我尝试让线程休眠,让它在下一次测试开始之前等待 Excel 完全关闭,但是当 Excel 被删除时它也会立即抛出异常(即使睡眠定时器还没有完成)。
无论如何,在这一点上,我正在寻找任何可能的指导,非常感谢。请记住,我不是任何这些技术的专家。
c# - 运行时可调用包装类未注册
我有一个用于 titan-FTP 的名为 srxCOM.dll 的 dll,这个 dll 是为 VB6 制作的。我想在 Visual Studio .NET 中使用 dll,所以我使用 tblimp 创建了一个运行时可调用包装器,并将其命名为 srxCOMnet.dll。我已将 dll 作为参考添加到我的 VS 项目中,并且可以访问其中的函数。在构建项目时,我收到此错误,
错误:CLSID {A82C6CF0-7B42-4ABD-AECB-987E298A41AF} 由于以下错误而失败:80040154 未注册类(HRESULT 异常:0x80040154 (REGDB_E_CLASSNOTREG))。
经过一些研究,我尝试过:
- 注册成功的 srxCOM.dll。
- 注册失败的 RCW srxCOMnet.dll。
- 将构建选项从任何 CPU 更改为 x86。
我不想在 VB6 中编写我的应用程序,还有什么可以尝试的吗?
c# - 找到office COM对象并正确释放
我正在使用一个执行 word 和 excel 自动化但没有正确释放 COM 对象的应用程序。我无法访问源代码,所以我想自己在 Windows 服务中发布 COM 对象。
我能否确定一个 excel 或 word COM 对象是否不再使用并正确释放它?
excel - 通过Powershell关闭时无法停止所有excel进程
使用此代码,我正在打开 excel(使用 visible = false 所以用户看不到它),写入工作簿,然后在脚本结束后打开 excel(使其可见)或完全关闭它而不保存。当我保存excel时,让它保持打开状态,结束脚本,然后稍后手动关闭excel,任务管理器中没有后台进程。但是,当我使用脚本关闭 excel 时,它仍保留在任务管理器中。
这是我开始excel的方式:
这是我关闭它的方法:
closeOnX 只是一个标志,因此它仅在某些情况下实际关闭 excel 应用程序。其余的在每次脚本结束时执行。
当我结束脚本并同时关闭 excel 时,我只想关闭当前的 excel 进程(这就是我不想停止进程的原因)而不关闭用户可能正在处理的其他工作簿。
当我结束脚本、保存并打开 excel 时,我希望在用户手动关闭 excel 时所有进程都消失。(这是工作)
c# - Closing Excel Workbook - System.Runtime.InteropServices.COMException : Exception from HRESULT: 0x800A03EC
I've put in the following method that returns a value from an XLS file cell :
The current code obviously generates an exception because the I close the Workbook and app and then return the value. What's the way to add
and still return the value ?
Thanks.
com - 在 windbg 脚本中获取 System.__ComObject 的 RCW 值
我正在尝试编写一个 Windbg 脚本,其中我在一个文件中有 1k 个地址。对于每个地址,偏移处0x30
是一个 COM 对象。
我想从 COM 对象中获取所有本机指针。我知道如何手动操作,如下所示。我在脚本中迭代它时遇到了麻烦。
从 a System.__ComObject
,!do <comobject>
给RCW: in text
. 倾倒RCW
使用!DumpRCW
给了我IUnknown pointer
我需要的东西。
对于脚本,问题是:
如何从使用脚本中获取RCW
价值?ComObject
中的字段System.__ComObject
为空。
我到目前为止的脚本:
c# - 如何将 COM 返回的对象的接口“替换”为托管代码?
我遇到了一些奇怪的性能问题,我怀疑它们可能是由于dynamic
指定了 COM 接口方法的返回类型。具体来说,这就是 IHTMLDOMChildrenCollection 接口在互操作中的结束方式:
而且我怀疑一旦我的代码调用item()
方法,就会创建一些额外的布线,这会降低其他代码的性能。
代码组织如下:
这个答案表明,如果 IHTMLDOMChildrenCollection 接口被声明为item()
返回object
,则性能可能会提高,而不是dynamic
。
是否可以声明一个新接口并以某种方式说服 CLR 给我一个实现该接口的 RCW?
我尝试了以下方法:
并在代码中:
它一直有效,直到执行行读取.length
。后者失败了
System.AccessViolationException: '试图读取或写入受保护的内存。这通常表明其他内存已损坏。
这应该工作吗?我究竟做错了什么?
c# - 已经与其底层 RCW 分离的 COM 对象不能使用,只能在测试调试中使用
我正在从 MSTest(作为 STA 线程)启动 WPF 应用程序。我在程序集初始化中启动应用程序并等待它完成加载。当我手动关闭主窗口(从测试中打开)和在程序集清理(自动方式)中关闭它时,在程序集清理方法完成后,我总是得到COM object that has been separated from its underlying RCW cannot be used, only in test debug
异常。我试图等待 GC 完成并 Dispatcher.CurrentDispatcher.InvokeShutdown();
按照类似线程中的建议调用清理,但没有运气。
请注意,在实际测试用例中,我没有做任何事情,因为我想最小化场景并确保仅通过打开和关闭应用程序来引发此异常。当然,当我只是手动运行应用程序而不是从测试中运行时,关闭窗口时不会出现任何异常。
还有其他建议可以防止这种情况吗?
当运行并且没有调试我的测试时,执行成功完成并且VS可以继续运行下一个计划项目的测试(与启动应用程序无关)。
堆栈跟踪
复制:
- 创建新的 C# WPF .NET Framework 解决方案(例如。
WpfApp1
) - 在自动生成的
MainWindow.xaml
添加一个简单的空网格
Program.cs
使用以下代码添加文件:
- 在解决方案中创建一个 C# MSTest 项目(例如。
UnitTestProject1
) - 在 MSTest 项目中添加 WPF 项目作为引用
- 在单元测试类中添加以下代码
- 调试
TestMethod1
c# - 退出时应用程序因访问冲突异常 (0xC0000005) 而崩溃
该应用程序是基于 .NET Framework 4.5 的 WPF 应用程序。它以 x86 模式构建,并在 Windows 7(32 位)上运行。
通过单击主窗口的关闭按钮退出应用程序时,有时会崩溃。
这是从转储文件中分析的主要信息。
在 XXX.exe.824.dmp 中,来自 Microsoft Corporation 的 C:\Windows\Microsoft.NET\Framework\v4.0.30319\clr.dll 中 clr!RCW::EnterContext+18 处的汇编指令导致访问冲突异常 (0xC0000005 ) 在线程 2 上尝试写入内存位置 0x00000008 时
这是转储文件中的调用堆栈信息。
这是来自 WinDbg 的另一个:
我已经尝试在应用程序配置文件(xxx.exe.config)中添加以下配置,但它们都没有生效。
那么如何处理或避免崩溃呢?
c# - 无法使用 Microsoft.Office.Interop.Outlook 使用已与其基础 RCW 分离的 COM 对象
我面临以下问题
以下代码:
我怎样才能避免这种异常?Marshal.ReleaseComObject(mail)
我应该用;释放邮件对象吗 ??