【问题标题】:Visual Studio 2017: How to run an app that uses both 32 and 64-bit DLLs?Visual Studio 2017:如何运行同时使用 32 位和 64 位 DLL 的应用程序?
【发布时间】:2018-09-04 17:28:09
【问题描述】:

我正在尝试运行使用 Nodejs、Edgejs、Angular4 和名为“CatalogService.dll”的 C# 后端服务层构建的 Web 应用程序。我正在使用 Visual Studio 2017 构建 C# 服务。每当我在 Visual Studio 中将平台目标设置为“任何 CPU”或“x64”并运行应用程序时,我都会收到一条错误消息:

检索具有 CLSID {EF5A2281-02BA-11D2-8922-AFB2FA76911F} 的组件的 COM 类工厂失败,原因是以下错误:80040154 类未注册

我在注册表中查找了 CLSID“EF5A2281-02BA-11D2-8922-AFB2FA76911F”。 CLSID 指的是我计算机上名为 RSEds.dll 的 .dll 文件。 CLSID 在 WOW6432Node 下,它告诉我 RSEds.dll 是 32 位 dll,但不是 64 位。

由于 DLL 是 32 位的,我尝试将 Visual Studio 中的目标平台设置为 x86。但是现在当我运行应用程序时,我得到了一个不同的错误:

错误:无法加载文件或程序集“CatalogService.dll”或其依赖项之一。试图加载格式不正确的程序。

我的电脑运行的是 Windows 7 x64。我正在处理的 C# 项目依赖于 32 位和 64 位 DLL。我已经面临这个问题超过 4 周了,并尝试了其他几种解决方案:

  • 尝试以管理员身份运行 Regsvr32(32 位和 64 位版本)以注册 RSEds.dll。虽然注册信息说成功了,但这并没有解决问题。
  • 尝试在 RSEds.dll 上使用 RegAsm,但失败了,因为 RSEds.dll 不是 .NET 程序集。
  • 尝试使用 gacutil /i 将 RSEds.dll 添加到全局程序集缓存 (GAC),但这会导致错误:将程序集添加到缓存失败:模块应包含程序集清单。
  • 尝试更改 IIS 中的应用程序池设置以启用 32 位应用程序,但这不起作用,因为我的 Web 应用程序不使用 IIS。

当 CatalogService.dll 同时依赖于 32 位和 64 位 dll 时,如何在我的 Web 应用程序中使用它?我确信 RSEds.dll 会给我带来问题,因为它是我的项目使用的唯一 32 位 .dll。有没有办法在 64 位注册表中注册 RSEds.dll,即使它是 32 位的?

【问题讨论】:

  • 罗克韦尔自动化不太可能无法帮助您。但你必须先给他们打电话。

标签: .net com visual-studio-2017 registry gac


【解决方案1】:

如果没有相应的 64 位 DLL 可用,您可以选择在代理进程中托管 CoClass。这样,即使服务器的位数不匹配,您的客户端也可以创建实例。然而,这种方法的一个缺点是跨进程边界的调用速度较慢。

请参阅this 回答了解更多详情。

【讨论】:

  • 是的,你说得对,我需要创建一个代理进程。我最终按照这里的步骤操作:techtalk.gfi.com/32bit-object-64bit-environment。基本上我将目标平台设置为“任何 CPU”,然后必须进入注册表并使 32 位 DLL 成为代理进程,以便 64 位进程可以访问该 DLL。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-04-11
  • 2011-08-14
  • 2013-11-17
  • 1970-01-01
  • 2018-05-10
  • 2018-10-31
相关资源
最近更新 更多