我有一个 COM+ 应用程序,它已使用组件服务导出到 MSI,然后安装在测试服务器上。Web 应用程序 (ASP) 无法从 COM+ 应用程序实例化它使用的任何对象。
COM+ 应用程序由 VB6 中内置的三个 DLL 组成。数据、应用程序和表示层各有一个 DLL。Web 应用程序仅使用表示层的对象。COM+ DLL 调用通过 COM 公开的几个 .NET DLL。
当 Web 应用程序运行时,HTTP 500 - Internal Server Error
返回 an。应用程序或系统日志中不会出现任何错误。
我尝试使用 VBScript 实例化对象WSH.CreateObject
,它仅适用于数据层中的对象。尝试在应用程序或表示层中创建对象时,出现以下错误:
Error: Could not create object named "My.ProgId"
Code: 800A801D
Source: WScript.CreateObject
因为它在 VBScript 中失败,所以我怀疑 ASP 应用程序没有问题,而 COM+ 应用程序有问题。
额外信息
如果我卸载 COM+ 应用程序并尝试运行我的 VBScript 来测试实例化,我会得到一个不同的错误。
Error: Could not locate automation class named "My.ProgId"
Code: 80020009
Source: WScript.CreateObject
由于错误不同,似乎 COM 至少在安装时找到了 COM+ 对象,只是无法实例化它们。
我也试过用 ProcessMon 监控脚本。我可以看到 WScript.exe(通过 COM)在注册表中查询 ProgID,然后是 CLSID。最终,DLL 的路径被拉回,然后 svchost.exe 和 dllhost.exe 使用 CLSID 查询注册表以获取相同的信息,并取回 DLL 的路径。最终,DLL 对其进行了加载映像操作,然后对 msvbvm60.dll 进行了相同的操作。我没有看到任何指向访问 COM+ DLL 失败的内容。
我现在尝试将 COM+ 应用程序安装到另一台 Win2k3 服务器和 Windows XP 桌面。能够从数据层 DLL 实例化对象,但不能从应用程序和表示层 DLL 实例化对象,我得到了相同的结果。我还尝试获取应用层 DLL 的旧副本,并且能够成功地从中实例化对象。但是,当我比较两个不同版本的项目文件时,没有什么是导致此问题的可能原因。