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

.net - 如何让 .NET CCW 程序集从 dll.config 加载配置

我有一个 .NET 组件公开为CCW(Com Callable Wrapper)并被加载到非托管 IIS 应用程序(ATL 服务器)中。该程序集使用regasm /codebase.

该组件需要配置,例如通常放入 IIS 应用程序的 Web.config 文件中。但我不想将配置放入 w3pw.exe.config 或 machine.config - 理想情况下,我希望将配置与暴露给 COM 的程序集一起实时安装。

我还没有找到实现这一目标的方法。由于 COM 程序集被加载到默认的 AppDomain 中,所以我认为我不能将该域配置为从备用位置加载。

0 投票
6 回答
2778 浏览

c# - 为什么我的 .NET 组件上的索引器并不总是可以从 VBScript 访问?

我有一个 .NET 程序集,我通过 COM 互操作从 VBScript(经典 ASP)访问它。一个类有一个索引器(也称为默认属性),我通过向索引器添加以下属性从 VBScript 中得到它:[DispId(0)]. 它在大多数情况下都有效,但在作为另一个对象的成员访问该类时无效。

我怎样才能让它使用以下语法:Parent.Member("key")其中 Member 有索引器(类似于访问内置Request.QueryString:的默认属性Request.QueryString("key"))?

在我的例子中,有一个父类TestRequestQueryString属性返回一个IRequestDictionary,它具有默认索引器。

VBScript 示例:

以下行导致错误而不是打印“值”。这是我想要使用的语法:

Microsoft VBScript 运行时 (0x800A01C2)
参数数量错误或属性分配无效:“QueryString”

但是,以下行确实可以正常工作并输出预期的“值”(请注意,第一行访问临时变量上的默认索引器):

下面是 C# 2.0 中的简化接口和类。他们已通过以下方式注册RegAsm.exe /path/to/AspObjects.dll /codebase /tlb

我已经尝试研究和尝试各种选项,但还没有找到解决方案。任何帮助都将不胜感激,以找出testRequest.QueryString("key")语法不起作用的原因以及如何使其起作用。

注意:这是通过 COM Interop 公开索引器/默认属性的后续内容。

更新:这是从类型库中生成的一些 IDL(使用oleview):

0 投票
0 回答
623 浏览

msbuild - 使用 nant 脚本运行 msbuild 来注册程序集有什么问题?

我正在从 NAnt 脚本运行 MSBuild。当它尝试为 注册我的一个程序集时com interop,脚本会像卡住一样停止。

如果我regasm.exe在程序集上运行,它会成功。即使我使用完全相同的参数从命令行运行 MSBuild 本身,它也会成功构建。

使用 NAnt 脚本运行 MSBuild 来注册程序集有什么问题?会不会是权限?

0 投票
2 回答
1009 浏览

windows - 从托管代码中的 shell 获取 Vista/Windows Search/propsys.dll 属性

有没有人设法做到这一点?我尝试为 IPropertyStore 创建一个托管包装类,但在获取指向 PROPVARIANT 的指针的方法(即 IPropertyStore::GetValue)上获得了 AccessViolationExceptions(在我的托管版本中呈现为 MarshalAs(UnmanagedType.Struct) 输出参数)可能是我的理解COM 和互操作是不够的 --- 我不确定问题是否出在我的 PROPVARIANT 结构声明中(目前只使用 StructLayout.Sequential,声明一个字节序列,并手动操作字节以获取各种类型的值工会等),COM 问题是什么进程拥有什么,或其他什么。我已经尝试过各种其他版本的 PROPVARIANT,例如对联合使用 StructLayout.Explicit,但没有任何效果。使用 IPropertyStore 检索 PROPERTYKEY::

0 投票
1 回答
165 浏览

.net - 无法从 COM 添加引用

我无法从我的窗口/程序集目录中选择 Microsoft.Office.Interop.Excel。我可以看到有一个,但它没有让我选择引用它。我该如何选择它?

0 投票
2 回答
2399 浏览

.net - Entlib 和互操作:它有效吗,配置文件在哪里?

我正在尝试将.net 代码中的 EntLib 3.1 用于为 COM 互操作注册的 dll。我在哪里放置配置文件?

或者,有没有办法在 dll 代码中指定它应该从哪里获取 entlib 配置?由于我的 dll 将从 COM 调用,所以我并不总是知道什么 exe 会调用它。

我创建了一个使用 entlib Logging 的简单应用程序,它有两个类:“CallingApp”和“MyComThing”。当我从 CallingApp 调用 MyComThing 的方法时,它会使用 CallingApp 的配置文件中的配置进行记录。当我从 vbs 脚本(即通过 COM)调用 MyComThing 的方法时,出现错误“在配置源中找不到 Logging 的配置部分”。我的 COMThing.dll.config 文件与注册的 COMThing.dll 位于同一文件夹中,即 bin\debug\ 文件夹中。

谢谢!

0 投票
3 回答
7469 浏览

c# - 是否可以从 .NET 测试 COM 公开的程序集?

我有一个通过 tlb 文件向 COM 公开的 .NET 程序集,以及一个注册 tlb 的安装程序。我已手动检查安装程序是否正常工作以及 COM 客户端是否可以访问该库。到现在为止还挺好...

但是,我正在尝试将一些自动化系统测试放在一起,以检查安装程序是否正常工作。作为其中的一部分,我已经在 VM 上自动安装,现在我想对已安装的 COM 库进行一些调用,以验证它是否正常工作。我最初考虑用 VB6 编写一些测试,但我已经有一大套用 C# 编写的测试,它们引用了 .NET 程序集。我希望我可以更改这些以引用 .tlb,但是当我在 VS2008 中尝试此操作时出现错误:

ActiveX 类型库“blah.tlb”是从 .NET 程序集中导出的,不能作为参考添加。

有什么办法可以欺骗 VS2008 让我添加这个引用,也许是通过编辑 tlb 文件?

谷歌搜索没有提出任何解决方案。我发现的只是一篇 Microsoft Connect 文章,说明这是“按设计”:http ://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=120882

0 投票
5 回答
12424 浏览

c# - 无法从 VBA 实例化用 C# 编写的 COM 对象(VB6 ok)

使用 VS 2008,这是我的 COM 对象

如果我构建它并在生产机器上注册它,如下所示

从一个简单的 VB6 应用程序可以正常工作

在 Excel 中从 VBA 调用的完全相同的代码给出

“自动化错误”(0x80131700)

在开发机器上一切正常,只是在安装了 .NET 和 MS Office 的生产机器上不行。

更新

我认为这与在 Excel 下运行时未正确初始化的 .NET 框架有关。如果我使用 Filemon,我可以看到它四处寻找 MSCORWKS.DLL。当我从 VBScript 调用同一个对象时,它发现 MSCorwks.dll 很好。

当我从 VBA 调用以尝试强制加载 CLR 时,有趣的是,我得到的结果与我在 VBA 中所做CorBindToCurrentRunTime的完全相同。HRESULT (0x80131700)CreateObject()

因此我认为这是一个框架初始化问题。

0 投票
1 回答
4735 浏览

.net - .NET 互操作:使用 C# 查找正在运行的 COM 对象的所有实例

背景

我正在通过命令行工具自动化一些 Office 应用程序(Word 和 PowerPoint)。

我的工具需要做的一件事是找到所有正在运行的 Word 实例。

我知道如何获得对其中一个实例的引用......

我的问题

如何找到我正在寻找的应用程序的所有实例,而不仅仅是其中一个。

注意:虽然我的具体问题是关于 Office 应用程序的,但我对更一般的答案感兴趣。

0 投票
2 回答
767 浏览

c# - .NET/COM 事件互操作性

我有一个由 TlbImp.exe 生成的互操作程序集,生成的类事件很多,性能非常重要。

但是有一个问题,事件似乎以这样的方式注册/取消注册/调用,即使是空的事件处理程序也被计算在内。给定一组1..N事件,当您将处理程序注册到事件 3 时,它看起来像这:

当有很多经常引发的事件时,这会产生很大的开销。

所以问题是,有没有更好的方法来处理 .NET 中的 COM 事件?任何工具或其他东西,或者我是否必须从头开始重写互操作程序集的事件代码?