关于COM的Reg-Free(免注册)技术简介及实例讲解。
我们都知道,在传统的COM技术中,当客户端调用COM时,该客户端必须首先通过regsvr32.exe在服务器上注册,否则会得到80040154(Class not registered)这样normal的 错误代码。
那么,是否说COM一定要事先注册才能被客户端调用呢?答案:不是。本文介绍了一种免注册(Reg-Free)的COM调用技术。
关于Reg-Free技术的参考文章,可以点击一下链接,在此不再赘述。
http://msdn.microsoft.com/en-us/magazine/cc188708.aspx
Registration-Free Activation of COM Components: A Walkthrough
http://msdn.microsoft.com/en-us/library/ms973913.aspx
下面简要总结一下采用Reg-Free COM 的runtime基本原理和要求:
1.客户端必须存在一个用来描述其程序所要装载的COM dll的文件清单(即*.exe.manifest文件)。假设客户端文件为clientapplication,则其manifest必须为clientapplication.exe.manifest。
2.COM dll文件必须放置于在clientapplication所在文件或者其子文件夹下,否则在runtime无法装载该COM dll而出现80070154的错误。
3.有关COM dll的清单文件,通过comdll.*.manifest来进行描述。
以下是一个client程序的manifest文件(文件名:client.exe.manifest)。在<dependency>section里面,表明需要引用的assembly为COMV1.sxs。其实COMV1.sxs是一个不存在的虚礼文件。
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="client"
version="1.0.0.0" />
<dependency>
<dependentAssembly>
<assemblyIdentity
type="win32"
name="COMV1.sxs"
version="1.0.0.0" />
</dependentAssembly>
</dependency>
</assembly>
然后,以下是对以上用到的COMV1.sxs虚拟文件的manifest文件(文件名:COMV1.sxs.manifest)
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
<assemblyIdentity
type="win32"
name="COMV1.sxs"
version="1.0.0.0" />
<file name="COMV1.dll">
<comClass clsid="{FCC1AA77-6E90-4CCC-9ACF-CB65C5629190}"
threadingModel="Apartment"
tlbid="{77D83C74-1B9F-4DC0-822B-CF02C66A7F94}" />
</file>
<comInterfaceExternalProxyStub
name="ISimpleClass"
iid="{9CDBEF0B-6DA9-49E3-AA85-FF75AA479BCF}"
proxyStubClsid32="{00020424-0000-0000-C000-000000000046}"
baseInterface="{00000000-0000-0000-C000-000000000046}"
tlbid="{77D83C74-1B9F-4DC0-822B-CF02C66A7F94}" />
</assembly>
当然,对于以上manifest文件的生成,我们可以采用第三方工具或者VS.net工具来生成。
关于Reg-Free用到的manifest文件生成工具及实例,可点击以下链接:
http://www.codeproject.com/KB/COM/regsvr42.aspx
因此,总的来说,利用Reg-Free技术来调用COM,客户端代码不需要做任何修改,只是需要将COM注册的方式由regsvr32.exe工具,改变成为读取配置文件的方式。
关于该篇文章示例所需源代码及配置文件,点击此处下载(本文代码只为展现该Reg-Free技术)