问题标签 [com-callable-wrapper]
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.
.net - 使用 CCW 调试从 VC++ 应用程序加载的 .NET 程序集
对于模糊的主题,我深表歉意,但我在这方面缺乏经验,无法提出更具体的内容。
我正在调试加载 COM 插件的第三方应用程序(用 VC++ 2005 编写)。我的插件是用 C# 4.0 编写的。当我的插件中的特定方法被调用时,应用程序崩溃,但给了我一个相当无用的调用堆栈:
我认为这告诉我的是存在与 CCW 相关的问题。应用程序在崩溃时应该在我的插件中调用的方法实际上也没有被调用。我更改了我的插件以立即抛出 NotImplementedException,并且它没有被抛出。但是,如果我修改同一接口中的另一个方法以引发 NotImplementedException,应用程序会正确报告该错误。
谁能推荐进一步的调试策略?
c# - .NET 4.0 中的“无法使用已与其基础 RCW 分离的 COM 对象”
我的 .NET 3.5 C# WinForms 应用程序中有一个类,它有五个方法。每种方法都使用不同的 C++ COM 接口集。用于Marshal.FinalReleaseCOMObject
清理这些 COM 对象。此代码在此 .NET 平台上运行良好,没有任何问题。但是,当我将此应用程序移至 .NET 4.0 时,我开始在这些方法之一中将变量从ICOMInterface1
to 转换为的行中出现此错误ICOMInterface2
,即:
无法使用已与其底层 RCW 分离的 COM 对象。
如果我删除正在使用的行Marshal.FinalReleaseCOMObject
,我不会收到此错误。
我在这里想念什么?以及如何从 .NET 4.0 平台的内存中清除这些非托管 COM 对象?
.net - COM Callable Wrapper 适用于 .NET 2.0 但不适用于 .NET 4.0
我编写了一个概念验证 COM 可调用包装器,以便用新功能替换现有的 COM 组件。我的项目的一个限制是我无法更改调用代码;调用代码应该不知道 COM Callable Wrapper 的存在。如果调用代码是 .NET 2.0,我创建的小型概念验证解决方案可以工作,但如果调用代码在 .NET 4.0 中,则会失败并出现 InvalidCastException。有人可以帮我发现这个 .NET 4.0-specific 的原因InvalidCastException
吗?
COM 可调用包装器:
调用代码(在行抛出异常new
):
.net - 使用 COM Callable Wrapper 来避免跨应用程序域传递 GCHandles 是否安全?
在 .NET 中,将托管对象存储在非托管代码中以提供来自非托管代码的回调存在一个相对众所周知的问题gcroot<ManagedObject>
:非托管代码在调用托管代码时不知道要使用哪个 AppDomain,有时它会选择错误的一个,导致“无法跨 AppDomains 传递 GCHandle”错误。
该问题的标准解决方法是使用指向委托的函数指针,因为委托可用于“记住”正确的 AppDomain:请参阅http://lambert.geek.nz/2007/05/29/unmanaged-appdomain -callback/以获得完整的解释。
然而,这个解决方案有点复杂,需要对委托进行仔细的生命周期管理。
似乎对托管对象使用 COM 可调用包装器也同样有效:与其存储 a gcroot<ManagedObject>
,不如将指针存储为IUnknown *
using GetIUnknownForObject
:
然后我们可以GetObjectForIUnknown
在进行回调之前进行反向翻译。缺点是失去了一点类型安全性,因为IUnknown *
失去了实际的对象类型,你以后不得不使用类似的东西向下转换
哪里m_value
是IUnknown*
,但这似乎是一个很小的代价。
我已经尝试过了,在我的用例中似乎可以正常工作,但是采用这种方法有什么问题吗?似乎它适用于任何可能使用委托解决方案的地方,所以我想知道我是否遗漏了一些关于它的东西。
.net - 如何诊断 COM 可调用包装对象创建失败?
我正在使用以下命令创建一个 COM 对象(来自本机代码)CoCreateInstance
:
实际上,我在 Delphi 中,这意味着我调用了辅助函数:
大多数情况下,此功能会成功。但有时,在同一个可执行文件中,在同一个进程中,调用CoCreateInstance
失败并显示:
再次调用该函数可能成功,也可能失败。没有(明显的)押韵或理由。
这不是我的 COM dll
如果这是我编写的普通COM dll,我会开始放入OutputDebugString
,DLL_ATTACH
当有人尝试调用时DllGetClassObject
,我会确认 COM 正确加载了我的 DLL,并且它正确地要求实例化一个类。
不幸的是,它不是 COM dll;这是一个 .NET 程序集 dll。而且 COM 子系统不会简单地 “加载”我的dll
. 相反,COM 被指示加载mscoree.dll
:
并mscoree.dll
导出所需的GetClassObject
功能。mscoree.dll
回来的也是E_FAIL
,不是我。在我的开发机器上从未发生过故障,但在客户机器上总是间歇性地失败。
如何启用 .NET 日志记录?
问题是,因为mscoree.dll
那个返回E_FAIL
(而不是任何有用的东西):我如何让它告诉我问题是什么?
例如,似乎唯一遇到故障的客户(除了是唯一大量使用 COM 对象的客户)碰巧在 Windows XP 上。也许他们遇到了 .NET 框架(版本 4 之前)中的已知错误,您无法将不同版本的 .NET 运行时加载到同一进程中:
这样做会引入一个 CLR 版本依赖关系,它可能与宿主进程期望的 CLR 版本冲突
在使用 COM 包装器时,MSDN 上的一篇文章中也提到了这种故障模式;您可以选择指定 a clrVersion
:
如果已经加载了另一个版本的 CLR,并且可以在进程中并行加载指定的版本,则加载指定的版本;否则,使用加载的 CLR。这可能会导致加载失败。
如果这是我在 Windows XP 或 .NET 框架上的早期版本中间歇性加载失败的原因,我该如何mscoree.dll
告诉我呢?
如果原因是其他原因,我如何让 .NET 告诉我?
.net - 从 vba 调用 .net 库方法
我在 ASP.net、c# 中开发了一个 Web 服务,并托管在 IIS 上,供 vba 客户端使用。下载了 Office 2003 Web Services 2.01 工具包后,我在成功创建所需的代理类时遇到了问题(许多用户在线记录),并决定改为创建一个 .net dll 库。我已经创建了库,它引用了 Web 服务并将其方法之一公开给 c# 中的公共函数。
我现在有三个问题:
如何在 VBA 中引用 dll 类?我试图转到工具-> 参考并浏览到 dll 位置,但我收到错误“无法添加对指定文件的引用”。磁盘上是否有我必须复制 .dll 的特定位置?
我还可以将 dll.config 文件复制到 dll 文件旁边,以便在那里有端点 url 吗?
由于调用的方法是接受一个对象(由各种成员和几个 List<> 成员组成,这些如何在 VBA 代码中实现?
vb.net - 部署 COM 可调用包装器
我的小组创建了一个 .NET 程序集,它在我们的 VB2010 项目中运行良好。我们还为 VB6 提供了一些函数,因此创建了一个 COM Callable Wrapper。我们也对此进行了测试,效果很好。我们的最后一步是确定如何部署到我们公司内的用户。我们知道要部署哪些文件以及如何注册它们。我一直在搜索 MSDN 和其他资源,以了解将它们部署到何处?
目前我们将包装 DLL、TLB 和 Interop DLL 部署到 {pf}\MyLib。是否有在何处部署 CCW 的最佳实践?我在想,因为它是一个 COM 对象,它必须被注册并且应该进入 {sys}。我可以参考任何参考来做出决定,我们将不胜感激。
c# - COM互操作程序集/包装器的调试源代码
通常,当您在 C# 项目中引用 COM DLL 时,Visual Studio 会自动生成运行时可调用包装器(RCW) 并将其编译为Interop.
程序集。
有没有办法调试到 RCW 的源代码?
我正在考虑的方法是捕获 PDB 文件,或者在解决方案中实际包含互操作库的源代码。
但据我所知,Visual Studio 在生成程序集时的行为是不透明且不可配置的(至少不是以任何明显的方式)。
谢谢!