无法实例化COM+;通过导出的应用程序安装的对象

无法实例化COM+;通过导出的应用程序安装的对象,com,com-interop,com+,createobject,typelib,Com,Com Interop,Com+,Createobject,Typelib,我有一个COM+应用程序,它已使用组件服务导出到MSI,然后安装在测试服务器上。web应用程序(ASP)无法从COM+应用程序实例化它使用的任何对象 COM+应用程序由三个内置于VB6中的DLL组成。数据层、应用层和表示层各有一个DLL。web应用程序仅使用表示层中的对象。COM+DLL调用通过COM公开的几个.NET DLL 当web应用程序运行时,将返回一个HTTP500-内部服务器错误。应用程序或系统日志中未显示任何错误 我尝试使用WSH.CreateObject从VBScript实例化对

我有一个COM+应用程序,它已使用组件服务导出到MSI,然后安装在测试服务器上。web应用程序(ASP)无法从COM+应用程序实例化它使用的任何对象

COM+应用程序由三个内置于VB6中的DLL组成。数据层、应用层和表示层各有一个DLL。web应用程序仅使用表示层中的对象。COM+DLL调用通过COM公开的几个.NET DLL

当web应用程序运行时,将返回一个
HTTP500-内部服务器错误
。应用程序或系统日志中未显示任何错误

我尝试使用
WSH.CreateObject
从VBScript实例化对象,它只适用于数据层中的对象。尝试在应用程序或表示层中创建对象时,我遇到以下错误:

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

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

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

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


当试图发现问题的原因时,错误消息毫无帮助。来吧,微软

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

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

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


当试图发现问题的原因时,错误消息毫无帮助。来吧,微软

表示层dll是否有
Main
例程?您试图初始化的对象是否有
类\u初始化
?如果是这样,您在这些地方放置了什么异常处理?表示层和业务层是否具有目标服务器上没有的其他依赖项?否
Main
例程和否
Class\u初始化
。有些类有一个
ObjectControl\u Activate
,但我相信在调用方法之前不应该触发它。某些方法中存在的错误处理,包括内部
ObjectControl\u Activate
,是一个传统的VB6
On error GoTo X
错误处理程序,它使用
App.LogEvent
将错误记录到事件日志中,然后引发新错误。我相信所有依赖项都已安装,但我会仔细检查。在我的开发人员机器上,当出现问题时,错误处理代码会成功写入事件日志。在测试服务器上,DLL没有写入事件日志。这可能是一个愚蠢的问题,但progid是否已在系统上注册?是的。当我使用ProcessMon时,我可以看到COM查询注册表,然后加载DLL。您的表示层DLL是否有
Main
例程?您试图初始化的对象是否有
类\u初始化
?如果是这样,您在这些地方放置了什么异常处理?表示层和业务层是否具有目标服务器上没有的其他依赖项?否
Main
例程和否
Class\u初始化
。有些类有一个
ObjectControl\u Activate
,但我相信在调用方法之前不应该触发它。某些方法中存在的错误处理,包括内部
ObjectControl\u Activate
,是一个传统的VB6
On error GoTo X
错误处理程序,它使用
App.LogEvent
将错误记录到事件日志中,然后引发新错误。我相信所有的依赖性