1

我有一个 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 的旧副本,并且能够成功地从中实例化对象。但是,当我比较两个不同版本的项目文件时,没有什么是导致此问题的可能原因。

4

1 回答 1

1

应用层 DLL 引用了struct在 .NET 程序集中定义的。该错误是由包含struct未在部署机器上注册的类型库引起的。

在 Visual Studio 中构建 .NET 程序集时,它会为程序集创建一个类型库并注册它。部署应用程序时,使用 .NET 程序集注册了 .NET 程序集regasm /codebase <assemblyname.dll>。这将注册类以便它们可以被实例化,但它没有注册任何结构。

解决方案是使用regtlib.exe在测试服务器上注册类型库。

尝试发现问题的原因时,错误消息根本没有帮助。微软加油!!

于 2012-03-01T23:01:48.810 回答