问题标签 [com-interop]

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 回答
2379 浏览

c# - 使用 COM-Interop 将数组从 JS 返回到 C#

我通过 COM Interop 和 WebBrowser WPF 控件将一些数据从我的 JavaScript 代码返回到我的 C# 代码。我已经成功返回了在 Javascript 中看起来像这样的数据:

现在我有 C# 中的对象结果,如下所示:

如何获取包含在此 ComObject 中的此数组中的 javascript 字符串?

0 投票
1 回答
1241 浏览

.net - 在暴露给 COM 的 C# 对象上实现 ISupportErrorInfo

我正在用 C# 编写一个 COM 对象,我想使用它理解的机制向 vba/asp 客户端软件提出错误 - Err 对象。

在过去的好日子里,这意味着在 COM 对象上实现 ISupportErrorInfo,但我找不到有关如何在 C# 对象中实现该接口的任何信息。

有人可以帮忙吗?

谢谢!

0 投票
4 回答
5339 浏览

vba - 如何将 COM 公开的 .NET 项目添加到 VB6(或 VBA)引用对话框?

根据Phil Wilson撰写的特殊文章Build and Deploy a .NET COM Assembly ,我创建了一个暴露给 COM 的 .NET 程序集。

在 .NET 程序集为 COM 正确注册的意义上,一切正常,并且编译后的 COM 代码可以毫无问题地调用它。

唯一奇怪的是,在使用 VB 6.0 或 VBA 时针对 COM 公开的 .NET 程序集进行开发需要程序员“浏览”到相关 .tlb 文件的确切文件位置,之后一切正常。也就是说,类库不会直接显示在“引用”对话框中,因此您必须浏览到文件位置。

同样,COM 互操作方面确实 100% 有效;但是,我认为必须有一些设置可以使库在 VB 6.0 和 VBA 的“引用”对话框中直接可见。

有谁知道这个设置是什么?或者这是否应该通过注册而自动为我发生?

非常感谢您的任何建议...

麦克风

编辑/更新

要回答 jpoh 关于我是否使用 /codebase 开关的问题,我使用的是 .msi 安装包,而不是明确使用 RegAsm。程序集已正确注册,这可以从以下事实看出:在 HKCR\CLSID{myGUID}\InprocServer32 中,“CodeBase”键正确地保存了程序集的完整路径。编译后的 COM 组件对这个 dll 执行得很好,只有在使用 VB 6.0 或 VBA 对其进行开发时,它们才不会出现在引用对话框中。因此,我需要“浏览”到正确的文件位置,之后它可以 100% 正常工作。

更新#2

经过进一步研究,似乎虽然类 GUID 已正确注册,但我的 .tlb 文件未注册。我不知道为什么不。注册 .tlb 文件应该在 HKCR\Interface{myInterfaceGUID} 中为我的类所基于的接口放置一些注册表项,但这不会发生。奇怪的是,除了在 VB6 和 VBA 的引用对话框中的可发现性之外,这种缺少注册似乎并没有影响 dll 的功能。

安装项目中我的 .tlb 文件的属性似乎是正确的:“PackageAs”属性设置为“vsdpaDefault”,“Register”属性设置为“vsdrfCOM”。我很困惑为什么这不会成功地安装在目标机器上。

更新#3

好的,事实证明安装项目没有成功构建......尽管它报告“构建成功”。

实际上有一个构建警告(令人惊讶的是,警告,而不是错误)被报告为“无法为文件名'DotNetLibrary3.tlb'创建注册信息”。由于这是一个警告,而不是错误,因此编译说明“构建成功”并且错误列表没有打开。

跟踪这一点,当您在 Vista 是您的开发机器时尝试创建安装项目时,这似乎是一个问题,如下所述:

VS2008 Setup项目中COM typelib注册问题

这里描述了一个有点手动的修复:

反馈:无法为名为“filename”的文件创建注册信息

我还没有尝试修复,但我明天会,如果解决了我会报告。

更新#4

效果不太好……在 Vista 上运行时,按照该文章中的建议运行 RegCap.exe 似乎不起作用。由于 RegCap 实际上是由安装项目本身在创建 .msi 时在内部运行的,因此这并不奇怪。简而言之,安装项目几乎肯定会失败,因为它正在调用的 RegCap 命令失败了……所以直接调用 RegCap 没有任何帮助。

最重要的是,这只是尝试在 Vista 上创建安装包时的一个错误。或者,也许它是 Visual Studio 2008 和 Vista 的组合,我不确定。尝试相同的方法是在 Windows XP 上运行的 Visual Studio 2005 上创建一个安装项目,绝对没有任何问题。

很可能有一些修复程序可以在 Vista 和/或 Visual Studio 2008 上正常运行,但我无法找到它。对我来说更高效的是在 Windows XP 上使用 Visual Studio 2005 生成 COM 注册要求,然后将它们导入到我的 Visual Studio 2008 安装项目中。这些可以通过 regasm 导出为 .REG 文件,对 dll 使用 /regfile 开关,对 .tlb 文件使用 RegCap(在 W'XP 上运行!)。由于我的 COM 接口不会改变,我只需要这样做一次。

希望在 Vista 上运行时 Visual Studio 2008 中的这个问题将在某个时候得到纠正,但如果没有,希望这篇文章对发现自己处于相同情况的其他人有所帮助......

也可以看看:

如何在自动化服务器列表中安装并注册用 VB.NET 编写的 COM Server for Excel?

——迈克

0 投票
1 回答
507 浏览

tdd - 模拟非虚拟事件(在 COM 互操作类中)

编辑:语言/平台是 C# / .Net

我目前正试图填补我当前项目中的一个巨大的单元测试空白,并且诚然是 TDD 的新手,我发现自己对于如何去测试一些更关键的业务特性感到很困惑。

我选择了 Moq 并有足够的时间做简单的模拟,但是在我的应用程序的核心是一个相当大的、可怕的 COM 互操作层,我很难概念化如何适当地进行单元测试。COM 组件完全是第 3 方,因此无法修改,它实现了相当于处理电话呼叫的有限状态机。该组件通过一组非虚拟事件通知我的应用程序,我想以某些顺序对其进行测试以模拟状态更改,但是 Moq 不提供除虚拟事件之外的任何方法来执行此操作。

所以我对知识渊博的 TDDers/Mockists 的问题是:你将如何测试这种东西?

显然 TypeMock 支持这一点(以换取它自己的缺点),但我宁愿不使用它,原因是关于类型安全的各种原因以及我普遍认为它在我背后做一些狡猾的事情。

0 投票
1 回答
494 浏览

asp.net - 在 Windows 服务中托管与 Silverlight 兼容的 Web 服务

是否可以创建 Windows 服务(可在 services.msc 中访问的后台应用程序)应用程序并在其中托管 ASP.NET WebService 或 Silverlight 兼容的 WebService?

我想创建一个 WebService 来执行 COM 互操作调用,并决定直接与 COM 接口以及托管 WebService 的 Windows 服务将是最灵活的方式。然后我可以创建一个 ASP.NET 网站和 Silverlight 应用程序来与 WebService 交互。

另一种方法是让 ASP.NET 在服务器端执行 COM 互操作调用,但这有多安全,.NET 甚至允许这样做吗?

0 投票
2 回答
1621 浏览

com - IDL 中不可创建的 coclass 的目的是什么?

在 IDL 中声明如下不可创建的 coclass 的原因是什么?

我的意思是这样的类无论如何都不会注册到 COM。在 IDL 文件和编译该 IDL 文件生成的类型库中提及它的原因是什么?

0 投票
2 回答
8598 浏览

windows - 在同一台机器上创建对象时,CoCreateInstance() 和 CoGetClassObject() 有什么区别?

我知道 CoCreateInstance 为给定的类 id 找到 COM 服务器,为该 id 创建对象实例并从该对象实例中检索接口。CoGetClassObject() 为类 id 找到 COM 服务器,为该类 id 创建类工厂的实例,并检索可用于创建实际对象的类工厂接口。

当用于在同一台机器上创建对象时,这些函数还有什么不同?它们的工作方式是否相同,但只会导致在完全相同的 COM 服务器中调用不同的代码?

0 投票
2 回答
1181 浏览

windows - 何时以及为何使用 CoLoadLibrary?

CoLoadLibrary() 的描述说它与 LoadLibraryEx() 几乎相同 - 将 DLL 加载到进程中。COM 类创建函数 - CoCreateInstance() 和 CoGetClassObject() - 也都将必要的 DLL 加载到进程中。

那么为什么首先需要 CoLoadLibrary() 以及应该如何使用它?

0 投票
3 回答
2063 浏览

windows - 使用空 BSTR 记录在哪里?

将空 BSTR(空 WCHAR* 指针)视为空字符串并相应地设计所有操作 BSTR 的代码至少是一种常见的做法。这个问题的答案是一样的。

这种做法记录在哪里?有没有描述这个约定的官方文件?

0 投票
3 回答
16179 浏览

c# - 警告 MSB3391:不包含任何可以为 COM 互操作取消注册的类型

我使用 VS2005 制作了一个简单的 C# DLL(这是一个更大项目的一部分)。我需要通过 VBA 代码在 Excel 中使用 DLL,因此我在程序集上使用 COM Interop。我正在尝试使构建过程自动生成必要的 TLB 文件,这样我就不需要在每次构建后转到命令行并使用 regasm。

我的问题是,虽然 DLL 编译和构建很好,但它不会生成 TLB 文件。相反,标题中的错误会在输出框中打印出来。

通过转到 VS2005 -> Build -> Output -> Check "Register for COM interop"中的项目属性,我已经获得了其他 DLL 来构建 TLB 文件。我还在AssemblyInfo.cs 中有[assembly: ComVisible(true)] 。

以下是问题 DLL 的源代码以及它为返回类型引用的 DLL 的摘要:

这里是 SymbolTable.dll 的摘要。它拥有 ProblemLibrary 使用的返回类型。