问题标签 [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 投票
1 回答
408 浏览

asp.net - 删除互操作的 CompilerOptions 指令

我已经为 COM dll 创建了一个互操作,tlbimp并将其添加到程序集缓存中。要在 ASP.net 页面中使用它,我需要包含以下内容

如果 CompilerOptions 指令位于程序集缓存中,为什么我需要它?我可以简化和集中这个吗?

0 投票
2 回答
1679 浏览

.net - 互操作和 RCW(运行时可调用包装器)有什么区别?

互操作和 RCW(运行时可调用包装器)有什么区别?

只是术语吗?

0 投票
1 回答
1100 浏览

reflection - 不使用 RCW 调用 COM 对象方法的最快方法

我试图找到调用 COM 对象方法的最干净和最快的方法。

我为该对象使用了 RCW,但每次第三方 COM 对象的新版本出现时,它的 GUID 都会发生变化,这会使 RCW 变得无用,所以我不得不更改并开始使用

这样每当 COM 对象的新版本出现时,我就不必重新编译和重新部署我的应用程序。

目前我正在使用反射,mytype.InvokeMemeber但与仅调用 RCW 相比,我觉得它太慢了。

其他人如何解决更改第 3 方 COM 对象版本的问题,但仍保持 RCW 的速度?

0 投票
3 回答
10541 浏览

c# - C# 包装器接口错误:E_NOINTERFACE

我正在尝试为我拥有的 COM 对象(名为 SC_COM.dll)生成 C# 包装器,但在将其与 Visual Studio 2008(运行 Vista)链接时遇到了一些问题。我需要使用 COM DLL 进行无需注册的操作——我正在使用清单文件让 Visual Studio 知道 SC_COM.dll,这似乎可以正常工作。我使用 TblImp.exe 生成了我在 Visual Studio 2008 中引用的类型库 (SC_COMtlb.dll),因此我可以与我需要的 DLL 进行早期绑定。DLL 都与清单和可执行文件位于同一目录中。

这是问题所在:当我实例化对象并尝试在 C# 中调用其方法之一时,它会引发以下错误:

检测到错误:无法将“SC_COMtlb.SCAccessObjClass”类型的 COM 对象转换为接口类型“SC_COMtlb.ISCUploader”。此操作失败,因为 IID 为“{C677308A-AC0F-427D-889A-47E5DC990138}”的接口的 COM 组件上的 QueryInterface 调用因以下错误而失败:不支持此类接口(来自 HRESULT 的异常:0x80004002 (E_NOINTERFACE)) .

我不完全确定这个错误意味着什么——我已经对错误代码进行了搜索,它似乎是一个相对普遍的 C# 错误。那么我是要在这里以错误的方式链接 COM 对象,还是我可能遗漏了其他一些重要步骤?

我可能应该注意到,我不完全确定我生成的类型库 (S\C_COMtlb.dll) 如何知道实际的 COM DLL 在哪里,因为它没有在系统中注册——我假设它只是看起来相同目录。这可能是问题所在,如果是这样,我怎样才能更好地将两者联系起来?

0 投票
1 回答
1523 浏览

visual-studio - VS2008 UnitTesting - 使用 Office 应用程序对象(PowerPoint 等)分离 RCW

背景

  • 我正在通过 C# 自动化 PowerPoint 2007
  • 我正在使用 Visual Studio (Microsoft.VisualStudio.TestTools.UnitTesting) 的内置单元测试为我的代码编写单元测试
  • 我在自动化 Office 2007 应用程序方面经验丰富

我的问题

  • 当我运行单元测试时,第一个单元测试方法运行良好,之后出现关于分离的 RCW 的错误
  • 我正在为要共享的测试方法创建一个 PowerPoint 的静态实例,但似乎在运行第一个测试方法后应用程序 RCW 正在分离

源代码

错误信息

此消息出现在使用 PowerPoint 实例的行上(当我设置 Visible 属性时)

我尝试过的

  • 单元测试的顺序不会改变行为
  • Word 2007、Visio 2007 等也会出现同样的问题。
  • 使用 NUNIT 编写测试用例时,我没有遇到这些问题 - 显然,Visual Studio 运行单元测试的方式有所不同(不是暗示 VS 不正确,只是指出它与 NUNIT 不同)
  • 它与 Visible 属性无关 - 任何方法或属性的使用都会导致此问题
  • 我尝试使用属性 AssemblyInitialize 和 ClassInitialize 来创建实例,但没有任何效果
  • 谷歌搜索和搜索 - 没有明确的答案可以帮助我

评论

  • 我可以切换到 NUNIT,但更愿意继续使用 Visual Studio 的本机单元测试框架

我的问题

  • 如何成功创建将在所有 TestMethods 之间共享的 PowerPoint 2007 的单个实例
  • 如果您能提供有关为什么会发生这种情况的见解,我将不胜感激。

已解决(感谢 ALCONJA)

  • 我按照他的建议修改了 .testrunco​​nfig 并且它起作用了。

链接

0 投票
1 回答
728 浏览

c# - C# 2005 COM 和 .NET 访问被拒绝 0x80070005 E_ACCESSDENIED

我正在用 C# 2005 重写一个 C++ 应用程序。该应用程序有 2 个组件:一个可以由 C++ 服务启动的进程外 COM 服务器。COM 服务器使用传出接口,这意味着它在特定事件时从 C++ 服务模块调用事件处理程序方法。

我正在重写 C++ 服务部分。现在我刚刚开发了一个应用程序,它使用运行时可调用包装器和连接点来启动 COM 服务器并为事件处理程序方法提供实现。当我运行应用程序时,COM 服务器启动正常,但当 COM 服务器尝试调用应用程序的事件处理程序方法时出现异常。

访问被拒绝。(来自 HRESULT 的异常:0x80070005 (E_ACCESSDENIED))

我在网上搜索了很多,这些是与我的问题密切相关的几个主题:http: //www.codeproject.com/Forums/1648/COM.aspx?fid= 1648&select=2189754&fr=1792#xx2189754xx

任何帮助将不胜感激。

0 投票
1 回答
157 浏览

.net - .net 运行时可调用包装器上的 VS2008 中的代码覆盖率

我有一个 .DLL,其中包含 COM/DCOM 对象的 .NET 运行时可调用包装器。

我在 VS 2008 中用 C# 编写了一个测试套件,它调用我们在上述 .DLL 中的服务器函数。

打开代码覆盖并运行测试套件时,代码覆盖测试结果没有产生任何统计数据,并且未覆盖和覆盖块都显示为零。

有谁知道为什么会这样?

任何人都知道如何在 .dll 上获得代码覆盖率,它们是 .net 可调用包装器?

0 投票
1 回答
628 浏览

c# - 通过 C# 调用 COM 组件的包装类是否需要实现 Dispose 模式?

我有一个用 c# 编写的类,它充当 COM 组件的包装器。COM 组件是早期绑定的,RCW 已由 Visual Studio 生成。我应该在我的包装类中实现一个 dispose 模式来清理 COM 引用,还是应该让 GC 处理它,因为它已经有一个 RCW?

0 投票
1 回答
3414 浏览

.net - 从 .NET 安全地释放 COM 对象引用

我在网上阅读了很多关于安全发布 RCW 的文章,在我看来,没有人能就具体需要按什么顺序完成的事情达成一致,所以我想请教各位大佬的意见。例如,可以这样做:

但是,有些人主张在之前进行垃圾收集,有些人在Marshal.FinalReleaseComObject之后进行垃圾收集,有些则根本不进行。是否真的有必要手动 GC 每一个 RCW,尤其是在它已经从它的 COM 对象中分离出来之后?

在我看来,将 RCW 从 COM 对象中分离出来并让 RCW 自然过期会更简单、更容易:

这样做就足够了吗?

0 投票
1 回答
27064 浏览

.net - 为什么关闭带有 WebBrowser 控件的表单时出现 RaceOnRCWCleanup 错误?

VS2008、.NET 2、VB.NET、XP ...

我有一个 Windows 窗体,带有一个 WebBrowser 控件和一个关闭按钮,它只执行Me.Close. 表单的取消按钮设置为关闭按钮,这样我就可以按 ESC 关闭表单。

DocumentText在加载事件中设置了 WebBrowser 控件的属性,并显示了 HTML。

从 Visual Studio 运行应用程序,如果单击“关闭”按钮,表单将关闭且没有错误。

如果我按下 ESC 按钮,我会得到

检测到 RaceOnRCWCleanup 消息:已尝试释放正在使用的 RCW。RCW 正在活动线程或其他线程上使用。尝试释放正在使用的 RCW 可能会导致损坏或数据丢失。

如果我在 VS 之外运行应用程序,我不会收到任何错误。

任何想法a)为什么会出现错误,以及b)如何防止或抑制它?

提前谢谢了。