.NET:.net 组件和com组件
在工作中,有时候用到了引用的组件,测试后,问题就出来了:
1.有的发布后总是提示找不到组件(com组件);
2.有的有版本问题(com组件:office导出word时用2003的com,2007下导出有问题);
3.有的提示未能加载程序集(。net组件:GAC和安装路径下都找不到指定程序集);
让我很糊涂,不知道.net 组件和com组件的关系,后来就查找,请教,讨论,最后我把我的理解写出来,也有从网上查的:
.NET组件可以分为两大类:共享的.NET组件和私有的.NET组件。
共享的.NET组件需要通过标准公开关键字密码技术来保证自身的唯一性,在这一点上面比较类似于COM的全球唯一ID号码GUID。但是,我们在可能的情 况下应当尽量避免使用共享的.NET组件,因为这样将会有可能再一次的陷入目前在视窗系统下长期困扰开发人员的“DLL地狱”,这种组件也是和提供组件的软件安装有关系的,比如说。net的office组件中,如果安装office时选择自定义安装中“office的。net支持”。那么对应的。net组件就会自动拷贝到GAC(全局程序集缓存)中,否则net组件中就没有office的组件。
私有的.NET组件是我们将会经常使用的.NET组件方式,在这种方式之下,我们发布.NET组件需要做的只是简单的进行拷贝操作就可以了,仿佛回到了远古的DOS时代了,在也不必关心纷繁复杂的系统注册表了,也不必担心DLL的版本被覆盖等等的问题了 ,这种就是自己编写的。
而COM组件是微软曾经力推了很多年的一种代码复用的技术框架,在这些年里也得到了极大的发展和应用,但它的弊端却也日益明显,我们不得不面对众多的 COM组件之间的版本控制和令人恐怖的DLL地狱,还有注册表、GUID等等。在我们安装一个软件的同时,也带来了大量的我们所未知的版本繁多的COM组 件到我们的操作系统中。
COM组件注册是指Windows编程中,为了使用自定义或第三方COM对象,对进程内组件(DLL)和进程外组件(EXE),利用自注册(self-registering)和非自注册组件程序而进行的操作。使用时必须要注册, 在使用.net中注册组件,有三种方式:
1.手动注册: win9x/NT/2000系统提供一个用于注册进程内组件的实用工具RegSvr32.exe,如regsvr32 c:\test.dll;在.NET下面,注册.NET组件就需要regasm命令了,如C:\>regasm out ClassLibrary1.DLL /regfile:ClassLibrary1.reg 。
2.编程注册:使用registrationhelper类,主要是利用在iregistrationhelper接口中的方法。
3.动态注册:是指在执行应用程序过程中,检查安装组件的版本,如组件的正确版本没安装,则在运行时自动安装需要的版本,即自动注册。
那如何选择哪?这个就根据具体的需求来了。如果你的功能只有一种可供引用,那就只能选那种了,如果你的功能,这两个里边都可以引用的话,就得看你的环境了,如果就是在。net环境下应用,那。net的组件要好些,因为com组件需要注册,有的还有版本问题;如果你也想写个com类似的东西,很标准,安全性高,也要供大家使用,那调用com会好些。
对于。net组件直接拷贝到应用程序指定目录下是否可用还在验证。
note:以上都是自己的理解,有不正确的,希望指正。