dll是动态链接库里面有好多方法(c语言叫函数),如果调用c语言编写的普通dll,那么就要用dllimport,典型的像windows api函数都是c语言编写的dll所以都要dllimport
com是一种与语言无关的windows规范,里面不光有方法还有一些遵照规范的描述性信息,比如有哪些方法,叫什么名字等。所以这种遵守windows统一规范的动态链接库就不需要dllimport了,就可以“添加引用”来用,而且还可以用对象浏览器来看里面都有哪些方法,而对象浏览器里的这些信息就是编写那些动态链接库的人遵照com规范写进去的,所以对象浏览器可以读出来看到。然后就可以using来用了,就像用普通的.net类库一样,因为和com的操作vs都封装好了,典型的像flash组件就是。
.net下有的命名空间可以直接using,比如system.io;
有的就必须添加.net引用后才能using,比如system.drawing,必须“添加引用”找到System.drawing确定,才能using System.drawing;
怎么回事呢?
因为system.io命名空间在system.dll这个程序集里面,system.dll这个程序集包括了好多的命名空间而不只一个。
![](http://hi.csdn.net/attachment/201104/15/0_1302852887z767.gif)
而system.io命名空间就在system.dll程序集里面,所以就不用添加引用了。
每个.net程序至少要包括一个引用”system",就是这么来的。因为system.dll程序集下面有好多常用的功能了。
而像system.drawing就不在system.dll程序集里,所以要单独添加引用“system.drawing”,其实是添加的system.drawing.dll这个程序集。
多用Reflector看看.net自带的程序集好多事情就豁然开朗了,.net framework其实是对api的封装,所以,一些程序需要api又不知道怎么用,网上也没资料的时候,就可以用Reflector看看.net的类库,看看微软是怎么用那些api的,有时就能有启发了。比如我就解决了一个问题,建立一个console程序让他不显示出来在后台运行,怎么做?
网上有2种方法一种api findwindow showwindow,这种方法还是会晃一下,放弃。
一种是process类有个createnowindow+useshellexecute,运行就可以不显示出来,很好。
但是现在我要在system账号下用CreateProcessAsUser这个api函数以administrator账号运行一个控制台程序,让他不显示出来在后台运行,而且没有administrator的密码无法直接用process类咋办呢?
所以我就用reflector看一下process类的start方法是怎么执行的,于是找到了这个,process类用的createprocess这个api,并把其中的creationFlags的值设为了0x8000000所以就可以建立不显示的console了,所以把这个flag套用到createprocessasuser,嘿嘿,在system账号下无密码以administrator账号运行程序而且不显示后台运行成功了。
![](http://hi.csdn.net/attachment/201104/15/0_1302854259dSU3.gif)