【发布时间】:2015-03-06 19:05:18
【问题描述】:
问题:
我正在更改我们为使用 ClickOnce 部署方法而开发的应用程序(项目 A)。我有一个使用 Redemption 的 VB DLL 项目。这已经在客户网站上运行了 3 年以上。我们目前使用 Install Shield 作为安装程序。通过此方法安装时,兑换工作正常。我们使用的是 VS2013,应用程序使用的是 .NET 3.5。
从 ClickOnce 构建安装应用程序后,应用程序运行但在尝试使用 Redemption 时出错:
无法将“System.__ComObject”类型的 COM 对象转换为接口类型“Redemption.IRDOItems”。此操作失败,因为 IID 为“{F8408EB8-6B65-4704-810C-29795E67C0DD}”的接口的 COM 组件上的 QueryInterface 调用失败,原因是以下错误:不支持此类接口(HRESULT 异常:0x80004002 (E_NOINTERFACE)) .
我有另一个使用 ClickOnce 部署的应用程序(项目 B),它也使用了 Redemption,并且运行良好。在这个项目中,与 Redemption 的区别在于它是在主项目中引用和使用的,而不是解决方案中的 DLL 项目。在这个项目中,赎回列在应用程序文件下。此应用程序使用 .NET 4.0。
为了让项目 A 工作,我复制了项目 B 中使用的设置。
在 Project B Redemption 中标记为:
- 隔离=真
- 嵌入互操作类型 = True
在 Project A Redemption 中标记为:
- 隔离 = 真
- 复制本地 = True
嵌入互操作类型不存在,因为它是 .NET 3.5
项目 A 的应用程序文件中没有列出 Redemption.DLL,但是如果我查看已发布的文件,它已包含在内,并且还部署在客户端计算机上。
VB DLL 的本机清单包含项目 B 清单中的所有接口条目。
我在 bing/google 搜索后发现了一些建议,但我找不到与 COM 文件有完全相同问题的人。这是我尝试过但失败的方法:
将 Redemption 文件添加到主项目(未对其进行引用)并设置 Build Action = Content and Copy to Output Directory = Copy Always。
- 这在发布时给了我一个错误,指出清单 赎回已经完成(即本机清单 VB DLL)。
- 更改 VB DLL 中的 Redemption 引用,使其不被隔离 允许构建工作,但仍然收到原始错误。
- 构建操作和隔离的不同组合 VB DLL 中的赎回产生了相同的结果。
将 Redemption 文件添加到主项目,但这次引用它。在主项目中设置isolated = true,在VB DLL 中设置为false。还尝试了在主工程和VB DLL中隔离和复制本地的各种组合。
编辑主项目文件并添加一个项目组以部署清单,如下所述:
我将项目 A 更改为使用 .NET 4.0,因此我可以在 Redemption 上使用与项目 B 完全相同的设置。
所有结果都相同。
总结:
Redemption.DLL 似乎已部署,但未以 VB DLL 看到它的方式注册。 任何建议都将受到欢迎。
【问题讨论】: