ClickOnce – Redemption.dll - 不支持此类接口

ClickOnce – Redemption.dll - No such interface supported

问题:

我正在更改我们开发的应用程序(项目 A)以使用 ClickOnce 部署方法。我有一个使用 Redemption 的 VB DLL 项目。这已经 运行 在客户站点上存在了 3 年多。我们目前使用 Install Shield 作为安装程序。通过此方法安装时,赎回工作正常。我们正在使用 VS2013,应用程序使用 .NET 3.5。

从 ClickOnce 构建安装应用程序后,应用程序运行但在尝试使用 Redemption 时出错:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Redemption.IRDOItems'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{F8408EB8-6B65-4704-810C-29795E67C0DD}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

我有另一个使用 ClickOnce 部署的应用程序(项目 B),它也使用 Redemption 并且工作正常。在此项目中,与 Redemption 的不同之处在于,它是在主项目中引用和使用的,而不是解决方案中的 DLL 项目。在此项目中,Redemption 列在 Application Files 下。此应用程序使用 .NET 4.0。

为了让项目 A 工作,我复制了项目 B 中使用的设置。

在项目 B 中,赎回被标记为:

在项目 A 中,赎回被标记为:

嵌入互操作类型不存在,因为它是 .NET 3.5

Redemption.DLL 没有在项目 A 的应用程序文件中列出,但是如果我查看已发布的文件,它是包含的,并且它也部署在客户端机器上。

VB DLL 的本机清单具有项目 B 清单中的所有接口条目。

我在 bing/google 搜索后找到了一些建议,但找不到对 COM 文件有完全相同问题的人。这是我尝试过但失败的方法:

将 Redemption 文件添加到主项目(未引用它)并设置 Build Action = Content 和 Copy to Output Directory = Copy Always。

将 Redemption 文件添加到主项目中,但这次是引用它。在主工程中设置isolated = true,在VB DLL中设置为false。还在主项目和 VB DLL 中尝试了隔离和复制本地的各种组合。

编辑主项目文件并添加项目组以部署清单,如下所述:

我将项目 A 更改为使用 .NET 4.0,这样我就可以拥有与项目 B 完全相同的赎回设置。

全部具有相同的最终结果。

总结:

Redemption.DLL 似乎已部署,但未以供 VB DLL 看到的方式注册。 欢迎提出任何建议。

为了完成这项工作,我结束了创建 Redemption 作为先决条件。

我创建了安装项目来安装 Redemption。为了制作引导程序以便它可以用作先决条件,我按照此处的说明进行操作 https://msdn.microsoft.com/en-us/library/h4k032e1.aspx