ActCtx + 清单 + comhost + .NET 6.0:它有效吗?有人有有效的示例吗?

问题描述 投票:0回答:2

我的目标是将 .NET 6.0 库公开给 COM,以便在 MS Access 中通过 VBA 使用它。并使用清单方法而不是使用注册表。

使用他们的“COM 服务器示例”示例代码,获得了文章“将 .NET Core 组件暴露给 COM”

但是,此示例要求包含可执行文件的文件夹中存在清单文件。当使用 MS Access 中的 COM 对象时,我们不希望将清单文件和其他文件放在 MS 安装文件夹中。

建议的解决方案是创建一个 Microsoft.Windows.ActCtx 对象,并让该对象创建我的 COM 对象,使用 ActCtx 对象的 Manifest 属性来指定清单文件。

这是持续失败的部分。 actCtx.CreateObject("") 会给出 Invalid Cast 异常,即使没有将结果分配给变量,因此这是一个内部问题。没有其他详细信息,事件日志中没有信息。在 C# 和 VBA 中尝试过此操作。

我有几个问题:

  1. ActCtx 是指定清单路径的方法,还是有更好的方法从 MS Office 中的 VBA 执行此操作?
  2. 该示例使用 COM 主机,它似乎是一些 COM 类/对象工厂,这反过来又有助于创建我的 COM 对象。与 .NET Framework 相反,这个 COM 主机似乎是为 .NET Core 引入的;在我的例子中是.NET 6.0。是否需要 COM 主机?是否可以更简单的直接实例化?

有人能回答这些问题、提示,甚至更好吗:一个可行的例子?

manifest .net-6.0 regfreecom
2个回答
0
投票

取得了一些进展,但我仍然不高兴。暂时放弃了 ActCtx 方法,尝试直接在 MS Access VBA 中创建示例的 COM 服务器对象。添加了对 com 主机的引用,例如 COMServer.comhost.dll,而不是实现 COMServer.dll。创建对象,只需使用 New 即可。错误:类未注册。执行了

regsvr32 COMServer.comhost.dll
并且示例正常工作。

虽然示例有效,但现在又出现了注册表项:服务器类的 guid 已添加到注册表中。 Regfree COM 未实现。

尽管 COMServer.comhost.dll 看起来很有前途。 VBA 可以看到单独构建并嵌入到 .dll 中的 tlb 类型库:智能感知工作并且对象浏览器工作。该清单似乎也正确嵌入到 .dll 中,并且优先于磁盘上的清单。

问题仍然是如何避免 regsvr32 步骤并通过在 MS Access VBA 中添加对 COMServer.comhost.dll 的引用来使解决方案正常工作。


0
投票

这是持续失败的部分。 actCtx.CreateObject("") 给出 Invalid Cast 异常 [...]

您收到的错误是客户端应用程序尝试查询

IDispatch
接口的结果,而您尚未实现该接口。在.NET(Core)中,您需要手动实现
IDispatch
,因为.NET没有为您提供实现。有关示例实现(在 C++ 中),请参阅 Don Bon 的 Essential COM,第 17 页。 350,“动态调用与静态调用”。

然后,您还需要在

.manifest
文件中添加一行来引用您的 TypeLib。

© www.soinside.com 2019 - 2024. All rights reserved.