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

时间:2012-02-28 04:05:07

标签: com com-interop com+ createobject typelib

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

COM +应用程序包含三个用VB6构建的DLL。每个数据库,应用程序和表示层都有一个DLL。 Web应用程序仅使用表示层中的对象。 COM + DLL调用几个通过COM公开的.NET DLL。

运行Web应用程序时,将返回HTTP 500 - Internal Server Error。应用程序或系统日志中不会显示错误。

我尝试使用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的旧副本,能够从中成功实例化对象。但是,当我比较两个不同版本的项目文件时,没有什么能引起这个问题的原因。

1 个答案:

答案 0 :(得分:1)

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

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

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

在尝试发现问题的原因时,错误消息完全没有帮助。来吧微软!!