Visual Studio 2017:如何 运行 一个同时使用 32 位和 64 位 DLL 的应用程序?
Visual Studio 2017: How to run an app that uses both 32 and 64-bit DLLs?
我正在尝试 运行 使用 Nodejs、Edgejs、Angular4 和名为 "CatalogService.dll" 的 C# 后端服务层构建的 Web 应用程序。我正在使用 Visual Studio 2017 构建 C# 服务。每当我将 Visual Studio 中的平台目标设置为 "Any CPU" 或 "x64" 和 运行 应用程序时,我都会收到一条错误消息:
为 CLSID 为 {EF5A2281-02BA-11D2-8922-AFB2FA76911F} 的组件检索 COM class 工厂失败,原因如下:80040154 Class 未注册
我在注册表中查找了 CLSID "EF5A2281-02BA-11D2-8922-AFB2FA76911F"。 CLSID 指的是我计算机上名为 RSEds.dll 的 .dll 文件。 CLSID 在 WOW6432Node 下,这告诉我 RSEds.dll 是 32 位 dll,但不是 64 位。
由于 DLL 是 32 位的,我尝试将 Visual Studio 中的目标平台设置为 x86。但是现在当我 运行 应用程序时,我得到了一个不同的错误:
错误:无法加载文件或程序集 'CatalogService.dll' 或其依赖项之一。试图加载格式不正确的程序。
我的电脑是 运行ning Windows 7 x64。我正在处理的 C# 项目依赖于 32 位和 64 位 DLL。我已经面对这个问题 4 个多星期了,并尝试了其他几种解决方案:
- 尝试以管理员身份 运行ning Regsvr32(32 位和 64 位版本)注册 RSEds.dll。尽管注册消息说注册成功,但这并没有解决问题。
- 尝试在 RSEds.dll 上使用 RegAsm,但失败了,因为 RSEds.dll 不是 .NET 程序集。
- 尝试使用 gacutil /i 将 RSEds.dll 添加到全局程序集缓存 (GAC),但这导致了错误:将程序集添加到缓存失败:模块是预期的包含程序集清单。
- 尝试更改 IIS 中的应用程序池设置以启用 32 位应用程序,但这不起作用,因为我的网络应用程序不使用 IIS。
当 CatalogService.dll 同时依赖于 32 位和 64 位 dll 时,如何在我的网络应用程序中使用它?我确信 RSEds.dll 给我带来了问题,因为它是我的项目使用的唯一 32 位 .dll。有没有办法在 64 位注册表中注册 RSEds.dll,即使它是 32 位的?
如果没有相应的 64 位 DLL 可用,您可以选择在代理进程中托管 CoClass
。这样,即使服务器的位数不匹配,您的客户端也可以创建一个实例。然而,这种方法的一个缺点是跨进程边界的调用速度较慢。
有关详细信息,请参阅 答案。
我正在尝试 运行 使用 Nodejs、Edgejs、Angular4 和名为 "CatalogService.dll" 的 C# 后端服务层构建的 Web 应用程序。我正在使用 Visual Studio 2017 构建 C# 服务。每当我将 Visual Studio 中的平台目标设置为 "Any CPU" 或 "x64" 和 运行 应用程序时,我都会收到一条错误消息:
为 CLSID 为 {EF5A2281-02BA-11D2-8922-AFB2FA76911F} 的组件检索 COM class 工厂失败,原因如下:80040154 Class 未注册
我在注册表中查找了 CLSID "EF5A2281-02BA-11D2-8922-AFB2FA76911F"。 CLSID 指的是我计算机上名为 RSEds.dll 的 .dll 文件。 CLSID 在 WOW6432Node 下,这告诉我 RSEds.dll 是 32 位 dll,但不是 64 位。
由于 DLL 是 32 位的,我尝试将 Visual Studio 中的目标平台设置为 x86。但是现在当我 运行 应用程序时,我得到了一个不同的错误:
错误:无法加载文件或程序集 'CatalogService.dll' 或其依赖项之一。试图加载格式不正确的程序。
我的电脑是 运行ning Windows 7 x64。我正在处理的 C# 项目依赖于 32 位和 64 位 DLL。我已经面对这个问题 4 个多星期了,并尝试了其他几种解决方案:
- 尝试以管理员身份 运行ning Regsvr32(32 位和 64 位版本)注册 RSEds.dll。尽管注册消息说注册成功,但这并没有解决问题。
- 尝试在 RSEds.dll 上使用 RegAsm,但失败了,因为 RSEds.dll 不是 .NET 程序集。
- 尝试使用 gacutil /i 将 RSEds.dll 添加到全局程序集缓存 (GAC),但这导致了错误:将程序集添加到缓存失败:模块是预期的包含程序集清单。
- 尝试更改 IIS 中的应用程序池设置以启用 32 位应用程序,但这不起作用,因为我的网络应用程序不使用 IIS。
当 CatalogService.dll 同时依赖于 32 位和 64 位 dll 时,如何在我的网络应用程序中使用它?我确信 RSEds.dll 给我带来了问题,因为它是我的项目使用的唯一 32 位 .dll。有没有办法在 64 位注册表中注册 RSEds.dll,即使它是 32 位的?
如果没有相应的 64 位 DLL 可用,您可以选择在代理进程中托管 CoClass
。这样,即使服务器的位数不匹配,您的客户端也可以创建一个实例。然而,这种方法的一个缺点是跨进程边界的调用速度较慢。
有关详细信息,请参阅