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

.net - .NET 运行时何时保持 COM 对象的引用计数 > 1?

直到最近,我还相信 .NET 运行时在创建运行时可调用包装器时只会将 COM 对象的引用计数增加 1 ,并且对于任何给定的 COM 对象只会创建一个这样的运行时可调用包装器。

如果我没记错的话,以上暗示Marshal.FinalReleaseComObjectMarshal.ReleaseComObject在实践中做同样的事情。

但是,今天我正在编写一些测试来验证我的代码是否正确释放了 COM 对象。我通过调用应该释放的对象并检查预期的InvalidComObjectException. 事实证明,在某些情况下,异常是在 a 之后引发的FinalReleaseComObject,但不是在 a 之后引发的ReleaseComObject

这是否意味着 .NET 2.0 运行时可以保存多个对 COM 对象的引用?如果是这样,它什么时候这样做?

0 投票
1 回答
261 浏览

c# - 如何将此非托管代码从 asp 传输到 asp.net 2/mvc?

我是 ASP.net 互操作功能的新手,所以我这里有一些我需要从我的 asp.net mvc 应用程序调用的非托管 dll。

dll 名称是 CTSerialNumChecksum.dll。我可以使用下面的这两行和我可信赖的响应轻松地从 asp 调用 dll。写一切正常。

我知道它是不受管理的,因为当我尝试添加对 dll 的引用时它不起作用。我尝试遵循一些关于互操作和编组的教程,但到目前为止我无法让代码工作。

我试图将对象包装到另一个静态类中,然后让应用程序的其余部分调用代码。所以不知道为什么让它在asp.net中工作如此困难,或者我只是一个白痴arggghhh ..

问题:

  1. 我如何写课程?我发现的大多数例子都没有涉及到类,.CRC32API 部分,而那些似乎很难
  2. 我可以使用什么工具来识别特定文件是什么类型的 dll,即非托管 c++ 等?
  3. 我还打算稍后使用 jquery 进行 ajax 调用,以便我可以使用它来验证我的表单预提交。有没有更好的方法来处理这个?

Dumpbin 调用返回给我这个,不知道为什么我看不到里面的验证函数名称:

更新:

这可能是由于名称修改造成的吗?因为它是一个 c++ dll,至少我怀疑它是什么......

0 投票
2 回答
1424 浏览

com - COM RCW 上的地址

是否可以在未知接口上增加 RCW 引用计数?(即不是底层 COM 对象的引用计数)

我有一些旧的 COM 服务器代码

这段代码工作正常,但现在我需要从另一个方法调用它。

comobject 的类型会有所不同(这就是它是 object 的原因)

0 投票
2 回答
2452 浏览

visual-studio-2010 - VS2010不会显示项目属性(“底层RCW”)?

只有有时(我还没有注意到模式),当我右键单击项目(各种类型的项目)并选择“特性”:

尝试加载页面时发生错误。 无法使用已与其底层 RCW 分离的 COM 对象。

我通常可以在重新启动 VS2010 后查看项目页面。我正在使用 RTM 版本。

什么会导致此错误?

0 投票
5 回答
12163 浏览

c# - 在 C# 中使用 COM 互操作时的 RCW 和引用计数

我有一个使用 Office 互操作程序集的应用程序。我知道运行时管理的“运行时可调用包装器(RCW)”。但我不太确定引用计数是如何增加的。MSDN 说,

无论有多少托管客户端调用它,RCW 只保留一个对包装 COM 对象的引用。

如果我理解正确,在下面的例子中,

我将实例传递wrd给另一个方法。但这不会增加内部引用计数。所以我想知道在什么情况下引用计数会增加?谁能指出引用计数增加的情况?

我还阅读了一些博客,其中说在使用 COM 对象进行编程时避免使用双点。像,wrd.ActiveDocument.ActiveWindow。作者声称编译器创建了单独的变量来保存将增加引用计数器的值。恕我直言,这是错误的,第一个例子证明了这一点。那是对的吗?

任何帮助都会很棒!

0 投票
1 回答
2907 浏览

c# - COM 对象是否已与其 RCW 分离?

我正在尝试解决“无法使用已与其底层 RCW 分离的 COM 对象”错误的问题,我认为导致它的原因是 COM 对象在未实例化它们的线程上使用。

我不允许进行太多重构,并且由于对象应该在多个线程上可用,我想知道是否有一种方法可以在对它们进行可能导致上述错误的操作之前找出它们是否已在当前线程上创建。并且,如果他们没有,创建它们。

另外,我是这个互操作的新手,所以如果有人能帮助我理解,我将不胜感激:

线程完成后 COM 对象会发生什么情况,为什么 RCW 在另一个线程上仍然可用,即使它不再包含 COM 对象(为什么它不为空?)。此外,为什么它会导致该错误并同时在 Marshal.IsCOMObject 上返回 true?

在以下使用引用计数、包装器和内存的情况下会发生什么:

  • 在线程 A 上创建 COM 对象 x
  • 传递它并保存在线程 B 上
  • 在线程 C 上创建另一个 x(或者,如果它是 y 会发生什么?)
  • 传递它并覆盖线程 B 上的 x
0 投票
2 回答
3063 浏览

c# - 使用 WPF 退出时的 COM 异常

执行以下两个测试用例后,COM 执行将打印到控制台。我究竟做错了什么?

如果我单独运行任一测试,或者如果我同时运行两个测试,则异常将仅写入控制台一次。这让我怀疑存在某种我没有清理的每个 AppDomain 资源。

我已经尝试使用 NUnit 和 MSTest 进行测试,在这两种环境中都具有相同的行为。(实际上,我不确定在 MSTest 中运行这两个测试是否会导致一个或两个异常打印输出。)

例外:

测试代码:

0 投票
1 回答
2791 浏览

.net - COM 字符串 (BSTR) 和 .NET 字符串有什么区别?

它只是组合字节以“编码”数据的方式吗?

我很好奇,因为我想知道 RCW 如何自动获取 .NET 字符串并将其转换为 COM BSTR。我猜它只是形成了一个从 .NET 字符串转换而来的有效 COM BSTR。

相关:我可以在 .NET 中使用字节类型构造我自己的有效 BSTR 吗?

0 投票
1 回答
719 浏览

com - 如何管理.Net的RCW COM对象创建参数(即请求接口)?

我在我的 C# .NET 应用程序中使用外部本机 COM 组件。

这个 COM DLL 没有类型库,所以我必须自己编写互操作代码,并且拥有 include/idl 文件,我像 TlbImp 那样做。但最糟糕的是对象创建失败:

如果我使用本机CoCreateInstance并指定class_id实现的接口 IID 之一,则最终创建该类。

事实证明,问题在于 COM 对象IClassFactory::CreateInstance不支持IID_IUnknown作为参数传递riid,因此返回CLASS_E_CLASSNOTAVAILABLE(我用反汇编器和调试器识别它)。该组件是 MS SQL VDI。

有什么方法可以强制 .NET RCW 将不同的接口 ID 传递给CreateInstance方法而不是IID_IUnknown? 我在网上搜索了很多,但没有找到解决方案。

作为一种解决方法,我现在使用 C++/CLI 来创建对象,请求正确的接口而不是IID_IUnknown现在用于此目的;但我想用 C# 编写代码,因为 C++/CLI 要求我为每个平台构建不同的 DLL。

谢谢

0 投票
1 回答
411 浏览

c# - 当 COM 对象与 RCW 断开连接时,有什么方法可以处理?

当 COM 对象即将与 RCW 断开连接而不实现 IDisposale 接口并在客户端代码中显式调用 MyObject.Dispose 时,有什么方法可以运行代码?

下面的代码不起作用。当程序进入 Finalize sub 时,ExcelApplication 已经与 RCW 断开连接,并且出现错误。我理解它为什么会发生,但我想得到一个解决方案。

我想让它按以下方式工作:当最后一个托管引用被释放时,在 COM 对象断开之前执行来自 Finalize sub 的代码。

我的问题是 - 有没有可能,如果是的话,我怎样才能在课堂上处理这个事件,而不需要从外部显式调用 Finalize?

非常简单的类:

此类用于表单 - 仅一行

将 ExcelRunner 调暗为 ExcelRunner = new ExcelRunner

然后我关闭表单,并收到错误。

谢谢