解决Windows.NET 下的COM+ 注册和登记问题

Windows.NET 下的 COM+ 注册和登记问题


小气的神

2002-6-23

Article Type: Tutorial

难度等级: 3/9

版本: 1.02

Windows.NET 迟早会是一个每日之星,我象喜欢 Windows 2000 一样的喜欢这个还未发布的操作系统,尽管不知道它会被拖延到明年的什么时候才会真正发布。 COM+ 1.5+ 和 IIS 6 让人期待已久了,一些文章和资料已经开始讨论和介绍一些有关所谓内幕的信息,比如 COM+ Partitions, Application recycling, Application pooling ,Configurable Isolation Levels, Low-Memory activation Gates, Http.sys, Web Administration Services, ASP Template caching, XML metabase, MSMQ 3.0 。

可以看到其中的许多功能是致力于改善 Web 应用程序的强健性和可靠性的,其中的许多特性,让开发人员感到激动和兴奋;相同的感觉让人很容易联想到几年前的 Windows 2000 发布前的情景,因为相关消息和报道也表明其中的一些特性可能不会放到最终的版本中,同时也可能有一些没有提及的功能会出现在最终的 Windows.NET 版本中,那么这些迷晦未知的同时也必然会有一些混乱或麻烦的事情让你遇到,比如下面这件。

鉴于 Windows.NET 的优异性能和 dotNET 有关 COM+ 的支持,让人会很容易的想移到 Windows.NET 上,它是如此地稳定如此的稳定,直到有一天,你将在 Windows 2000 下用 dotNET 开发的 COM+ 应用放到 Windows.NET 上,你会发现问题来了。而且很头痛,不过这里也是揭示 Windows.NET 虽然有 .NET 的后缀,但并不意味着它对 dotNET 技术的友好和完全支持,相对 dotNET ,它更喜欢 COM+ 和 IIS ,如果不是它的老板一定要给它预装 dotNET 的运行库,我想叫它 Windows 2002 或 Windows 2003 会更好,这样至少不会让人以为它是一个 for dotNET 的操作系统。

.NET SDK 中有两个工具是和 COM+ 组件的登记和类型库有关的,一个是 Assembly Registration Tool ( regasm.exe ) 另一个是 .NET Services Installation Tool (Regsvcs.exe) ;在 Windows 2000 下, 一般我们完成一个 dotNET 的 COM+ 组件后,会先运行 regasm 产生类型库和注册信息,然后再运行 Regsvcs.exe 来完成向 COM+ 环境中添加新的 Application 的工作,从而完成整个的安装和登记任务。一些人建议直接使用 regsvcs.exe 就可以了,因为 Regsvcs.exe 会自动的调用 regasm.exe ,理论上一般它会做这样三件事:

1. 它登记一个 CLR assembly 为一个 COM 组件 ( 等于你运行 regasm.exe)

2. 它产生一个 COM 类型库,在部署你的 dotNET 组件到一个 COM+ 目录 [COM+ catalog] 时会使用这个类型库 ( 等于你运行 tlbexp.exe ) ,并且从你 assembly 中获得 ApplicationName 和 ApplicationActivation 等属性在 COM+ Catalog 中建立一个 Application 。

3. 最后它使用 .NET reflection APIs 从你的 assembly 中获得每个类的属性信息,从而更新 COM+ catalog 中的每个类的属性设置,使得每个类和你编程时设置 Attribute 的相同。

这些步骤在 Windows 2000 的环境中工作的非常顺利,但当你将这些 COM+ 放到 Windows.NET 的环境下想同样的将它注册到 Windows.NET 的 COM+ Catalog 时,就会遇到麻烦,产生一个错误,结果,什么都没有注册,或说你无法完成注册过程。

从 Event viewer 中你可以看到更详细的一些 dump ,但是我保证对你没有任何帮助,我曾将这些信息放到网络上的新闻组和 BBS 中,当然也包括 Microsoft 的。有不少网友证实他们在自己的环境下可以恢复和重现这个错误,但似乎没有提供任何解决的办法,终于我开始等待 Microsoft 有关 Windows.NET 的 Patch 了,从 Windows.NET 3604 开始到 3615,3621 几乎这些 Windows.NET 的三个版本都存在同样的问题,最近又有两个新的版本号的 Windows.NET 测试版发布,不过我已经有些厌倦了不断在这些系统上安装应用软件的过程,所以不能证实后两个版本是否已经解决了 :)

System.EnterpriseServices.RegistrationException: Unable to open COM+ 1.0 catalog to configure components. ---> System.Runtime.InteropServices.COMException (0xC0000005): Exception from HRESULT: 0xC0000005.

at System.EnterpriseServices.Admin.ICatalog.GetCollection(String bstrCollName)

at System.EnterpriseServices.RegistrationDriver.PrepDriver(ApplicationSpec& spec)

--- End of inner exception stack trace ---

Server stack trace:

at System.EnterpriseServices.RegistrationDriver.InstallAssembly(String assembly, String& application, String partition, String& tlb, InstallationFlags installFlags, Object obSync)

at System.EnterpriseServices.RegistrationHelperTx.InstallAssembly(String assembly, String& application, String partition, String& tlb, InstallationFlags installFlags, Object sync)

at System.Runtime.Remoting.Messaging.Message.Dispatch(Object target, Boolean fExecuteInContext)

at System.Runtime.Remoting.Messaging.StackBuilderSink.SyncProcessMessage(IMessage msg, Int32 methodPtr, Boolean fExecuteInContext)

Exception rethrown at [0]:

at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg)

at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData& msgData, Int32 type)

at System.EnterpriseServices.RegistrationHelperTx.InstallAssembly(String assembly, String& application, String partition, String& tlb, InstallationFlags installFlags, Object sync)

at System.EnterpriseServices.RegistrationHelper.TryTransactedInstall(String assembly, String& application, String partition, String& tlb, InstallationFlags installFlags)

at System.EnterpriseServices.RegistrationHelper.InstallAssembly(String assembly, String& application, String partition, String& tlb, InstallationFlags installFlags)

at System.EnterpriseServices.Internal.ComManagedImportUtil.InstallAssembly(String asmpath, String parname, String appname)


如果你也曾遇到相同的问题 ( 或是在 Windows XP 上,我没有安装和使用过任何 XP 的版本,所以不知道 Windows XP 下是否有这样的问题,如果没有,那么你将是多么地幸福 ) ,现在有一个简单的办法可以解决这个问题, Roman Kiss 在 codeproject 上有一篇文章是关于 .Net/COM+ Installation Tool ,这篇文章早就有了, dotNET Beta2 时期,我最近才发现并联想它可能可以解决所遇到的问题。

在 Microsoft 没有发布新的 Patch 前可以用两种方法来解决这个问题:

1. 先在 Windows 2000 的环境下将其安装和调试完毕,然后 Export 这些 Application 到一个 msi 的安装包中,然后在 Windows.NET 的环境中安装这个包。这种方法可以避免发生这样的问题,但是很不稳定,也就是说有时你可以成功安装,有时你不能。另外如果你是的开发环境或其它的应用是在 Windows.NET 上,你会感到非常的不适应和沮丧,频繁的切换于两个系统和不停的打包安装可以让你忘了真正要做的是什么。

2. 另一种方式是写一个自己的 Regsvcs 程序来完成登记的过程,因为从错误信息来看,显示是 dotNET 的 Regsvcs 程序和 Windows.NET 下的 COM+ catalog API 有问题,也许现在的 Regsvcs 只认 1.0 的 API ,而 Windows.NET 至少是 1.5 的了。我也试图这么做了,简单的 Sample 或是 API 手册让我很快的恢复了使用 Regsvcs 时相同的错误,唯一不同的是现在可以单步 debug ,知道出错在那一个语句了。直到我看到 Roman Kiss 的文章,我终于知道正确的方式是怎样的了。

下面是解决的步骤:

1. 先去 ** [CodeProject 96.4K] ** 获得这个 project 程序,解压缩后,删除 COMAdmin 的引用,添加一个新的 Windows.NET COMAdmin 引用库,然后编译整个 Project 。最后你会得到一个 Regasm2.exe 的程序,这就是一个新的 Regsvcs 注册程序。

2. 切换到 project 中的测试程序目录进行注册。

regasm AttributeTester.dll /tlb:AttributeTester.tlb

regasm2 AttributeTester.dll


3. 打开 Component Services 的 COM+ Explorer , 你会发现组件已经被正确的注册了,并且 Application 和每个组件的属性都是依照你程序中设置的那样被设置了,这一点很重要,因为使用上面我说的第一种解决方法 ( 使用倒出的安装包 ) ,经常是好不容易安装组件包成功,但是发现这些属性信息没有被正确的设置,更多的属性是空白的。 ( 类似的情况也发生在从 Windows.NET 的 COM+ 中倒出的组件安装包,重新安装到 Windows 2000 的环境中,理论上 Windows.NET 支持另外更高版本的安装包格式,因为倒出时 Windows.NET 允许你选择是否兼容 COM+ Admin 1.0 的格式 )

4. 最后我们简单的测试一下,看这种方式下是否正确的工作了,我简单的使用 OLE/COM Object Viewer ,它有一个好处,就是现在所有的 CLR assembly 被注册到 COM+ 中,你在这个工具中可以看到它会自动的被归类到 Grouped by Component category -> .NET Category 中,这样就很方便的可以找到你的组件。选中组件,然后点右键在菜单中选择 Create Instance 就可以简单地测试它是否运行正常了。

5. 看来结果好像还不错,正是我们想要的,从 DebugView 中 Dump 出的信息,正是我们 download 的代码中特意要输出的信息。

我不知道这是否是一个愉快之旅,但我的确可以不用为 Windows.NET 下有关 COM+ 组件登记注册的事情再烦恼了。最后发布的 Windows.NET 一定没有这个问题,所以在这之前的一段时间,我想,正如广州现在的天气,可以用一个词来形容:郁闷。还好网络上没有下雨的阴闷,而且总有一些让你感到轻松的人,所以一定要感谢 Roman Kiss 。


特别:

本文原创, CSDN 署名首发,所有文字和图片版权所有。未经授权请勿传播、转载或改编。

如果有问题或建议,请发电子邮件给 [email protected]

Published At
Categories with Web编程
Tagged with
comments powered by Disqus