新增引用、dllimport、using、名稱空間和dll的區別
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這個程式集包括了好多的名稱空間而不只一個。
而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賬號執行程式而且不顯示後臺執行成功了。