问题标签 [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 回答
2566 浏览

c# - 在 ASP.NET MVC 应用程序中使用 WebBrowser 控件

是否可以创建一个且唯一的 WebBrowser 控件并将其保存在会话值中,然后在必要时使用它?如果是这样,如何?

我创建了 WebBrowser 对象并将其保留并保留在某个 Session 值中,但是每当我尝试访问该对象时,我都会收到“无法使用已与其底层 RCW 分离的 COM 对象”错误。

我被困住了。

0 投票
0 回答
271 浏览

c# - 如何让垃圾收集清理绑定到 out-proc COM 服务器的 RCW 对象?

我有一个运行数天的 64 位 .NET 进程。该进程使用使用 DCOM 的本机 32 位 COM 服务器。COM 服务器偶尔会耗尽内存,因为 .NET 进程垃圾收集器只能看到 COM 对象的 RCW,而且这些 RCW 非常轻量级并且“不值得收集”。我需要以某种方式让垃圾收集器知道那些 COM 对象。

作为记录,我尝试定期运行相同的代码强制启动垃圾收集并且问题消失了,因此问题不是某种泄漏,只是对象收集速度不够快。

是的,我知道GC.AddMemoryPressure()可以告诉垃圾收集器我们现在正在消耗更多内存。问题是 64 位 .NET 进程可能将其视为“没什么大不了的”——它是 64 位的,好吧,这里是千兆字节,那里是另一个千兆字节——“谁在乎”,但是对象实际存在的 32 位进程对这些分配更为敏感。

所以对于 64 位进程来说可能是“没什么大不了”的东西对于 32 位进程来说肯定是一个大问题,我需要以某种方式使 64 位进程的垃圾收集器对使用的内存量更敏感通过另一个过程。

我该如何处理这种情况,以使 64 位进程及时收集 RCW 并且 32 位 COM 服务器不会耗尽内存?

0 投票
1 回答
70 浏览

c# - 我可以强制收集特定类型的对象吗?

我对没有及时收集 RCW 有疑问。我想到定期从内部代码强制启动垃圾收集。但是,我不确定这是否会出现一些不希望的减速。

我实际上对收集所有对象并不感兴趣,我只需要收集 RCW 并且它们都有System.__ComObject类型。我想只收集它们会更快。

是否可以仅对某些类型的对象强制进行垃圾收集?

0 投票
1 回答
885 浏览

c# - 从 C# 加载 C++/CLI 程序集

我正在围绕一组专有 COM 对象编写 C++/CLI RCW,以供 C# 应用程序使用,当我部署 RCW 和 C# 应用程序时,我收到 FileNotFound 错误。

在此之后,我做了最简单的事情:

使用 C++/CLI (VS2012) 编写的 .NET 类库,默认实现中未添加任何代码。

AC# Windows 窗体应用程序、解决方案和项目设置为目标 x86。添加到 C++/CLI 类库的引用但是 C# 应用程序中的一个按钮,并在 C++/CLI 库中创建了 Class1 的实例。

错误还是一样;详细地:

我已使用 Fusion Log Viewer 尝试查找错误,但根据日志,我的 ClassLibraryTest.dll 已成功加载。

我在这里想念什么?

0 投票
2 回答
106 浏览

c# - 除了“await”还有什么情况会允许同步代码被打断

我最近在我的异步代码中遇到了一个奇怪的错误。我在 COM 控件上调用了一个阻塞方法,这似乎允许我的异步继续在它阻塞时运行。

考虑示例代码(仅用于说明目的)

在正常情况下,我希望得到以下输出:

我实际上看到的是:

现在我没有 COM 控件的源代码,但我知道这是一个非常古老的 C++ 控件,没有异步/等待的概念。然而,它是一个 Active-X 控件。

我不知道 .Net RCW 的实现细节,但我假设必须进行某种消息泵送才能使控件正常工作。我还假设这种泵送允许我继续运行。

我的假设正确吗?还有我应该知道的其他任何情况,我的所谓同步代码可能会被中断吗?

0 投票
0 回答
37 浏览

.net - 为什么 RCW 从自己的公寓调用它时会处理 WM_PAINT

我的应用程序是本机 Windows 应用程序 (MFC/Win32),它通过 COM 加载 .NET 插件。该应用程序通过 COM(在 ATL 中实现)公开其文档模型。

我有一行代码在.NET 端看起来像这样:

var settings = Application.UserSettings;

在本机应用程序的 WM_PAINT 处理程序中使用断点,断点将在此行(以及其他行)上触发。我无法看到这一点之后的堆栈跟踪,但我认为它在 WM_PAINT 处理程序中停止执行,因为它包含我唯一的断点,但我无法看到 RCW 之后的堆栈。

我怀疑在get_UserSettings属性获取器中,RCW 将处理 WM_PAINT。如本文所述,我禁用了 WM_PAINT 调度,并且 WM_PAINT 调度停止了,这对证实我的怀疑大有帮助。

这一切都发生在 STA 的 UI 线程上。COM 对象是 STA,是在 UI 线程上创建的。我认为 COM/RCW 只会在进行跨公寓封送处理时处理 WM_PAINT,同时等待方法调用完成执行。

我的问题是:为什么在这种情况下 RCW 处理 WM_Paint ?

0 投票
0 回答
1786 浏览

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

我的 asp/C# 站点中有一个小功能,它使用 PIA 通过 excel 导出一些数据。

经过几天关于如何正确使用所有这些的研究后,有时我会收到此错误:

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

在 Microsoft.Office.Interop.Excel.ApplicationClass.set_DisplayAlerts(布尔 RHS)

在那之后,我总是得到另一个错误,但我认为它与第一个错误有关/引起:

尝试读取或写入受保护的内存。这通常表明其他内存已损坏。

在 Microsoft.Office.Interop.Excel.ApplicationClass.Quit()

我感到很困惑,因为我在三台计算机上对此进行了测试,并且在其中两台计算机上运行良好。

相关代码如下:

公共静态类导出{

RelecaseComObject() 如下:

MergeCells() 是这样的:

查看错误的行,可能是由于从该函数内部调用 objExcel.DisplayAlerts 而不是 main 函数引起的?(我想尝试一下,但在第三台计算机上多次部署代码有一些限制)。

如何正确管理代码以使其安全并避免此类错误?

提前致谢。

0 投票
1 回答
385 浏览

vb.net - “Option Strict On 不允许隐式转换”执行不一致

  • 配置 1:使用面向 .NET 4.5.2 框架的 Visual Studio 2015 为 ArcMap 10.4 构建 ESRI 插件
  • 配置 2:使用面向 .NET 3.5 框架的 Visual Studio 2013 为 ArcMap 10.3 构建 ESRI 插件
  • 配置 3:使用面向 .NET 4.5.2 框架的 Visual Studio 2013 为 ArcMap 10.4 构建 ESRI 插件

我试图了解为什么 VB.NET 项目中的 Option Strict On 强制执行不会在两个项目中引发错误 BC30512,而在另一个项目中会引发错误。这是一个示例代码行,它使用配置 1 触发错误,但不会触发配置 2 或 3 的错误。

此外,如果我实例化托管类而不是 coclass,则在任一配置中都不会触发错误(请参见以下行):

ArcMap 的不同版本决定了所针对的框架版本。有关其他背景,ArcObjects 文档的 COM 到 .NET 类型转换是相关的: Using ArcObjects (COM-based) in .NET (ArcObjects .NET 10.4 SDK)

为什么错误是在配置 1 中触发,而不是在配置 2 或 3 中?为什么使用托管类而不是 coclass 实例化配置 1 时不会触发错误?

链接到在 dotnet/roslyn github 存储库中提交的问题。 https://github.com/dotnet/roslyn/issues/13314

谢谢乳木果

0 投票
2 回答
502 浏览

vb.net - 与 vb.net 表单事件相关的“无法使用已与其底层 RCW 分离的 COM 对象”错误

我将 arcobjects 地图事件连接到 vb.net 表单以侦听地图选择更改。这一切正常,但用户在打开表单时偶尔会报告此错误。我看不到任何重现错误的模式,而且它似乎是随机的。

“无法使用已与其底层 RCW 分离的 COM 对象”

它源自我挂钩事件的表单Load()方法。

谁能帮我理解我做错了什么?我正在取消 FormClosing() 事件中的地图选择事件,我认为这是正确的方法。

0 投票
1 回答
156 浏览

.net - .NET Native 和 RCW 开销

我很好奇 .NET Native 的工作原理。通常在托管代码中使用 WinRT 类时,它们是通过 RCW 调用的,由于托管代码和非托管代码之间的互操作,会产生一些开销。我想知道使用 .NET Native 编译托管代码时理论上是否存在相同的开销?