1. 程式人生 > >.net組件和com組件&托管代碼和非托管代碼

.net組件和com組件&托管代碼和非托管代碼

DUID 動態鏈接庫 soft 組成 ros 重新 https 完成 內存

com組件和.net組件:

COM組件是非托管對象,可以不需要.NET框架而直接運行,.NET框架組件是托管對象,必須有.NET框架的支撐才能運行。

COM組件有獨立的類型庫文件,而.NET組件是通過使用程序集清單來進行自我引用

COM組件基於接口進行通信,而.NET組件直接通信,不通過中間接口查詢
COM組件必須在註冊表中註冊DUID項,.NET組件卻不需任何手工註冊
COM組件沒次可以而且只能註冊一個版本,.NET組件可以並存

托管代碼和非托管代碼:

1簡單的說,就是代碼被編譯成MSIL後在.net的Framework下運行,同操作系統底層的交互都交給framework去做。所謂非托管代碼就是脫離了Framework的管制,直接同底層API打交道,自己管理自己的內存和安全機制等東西。而托管代碼就不管這些,全都由Framework去完成

2“程序”一般都是在對操作系統進行直接或者間接的操作
“托管程序”是需要通過訪問公共語言運行時(cls)才能訪問操作系統的程序
而“非托管程序”不用通過訪問公共語言運行時(cls)可以直接訪問操作系統的程序

備註:

Question: 什麽是COM組件?
Answer: COM組件是以WIN32動態鏈接庫(DLL)或可執行文件(EXE)形式發布的可執行代碼組成。 COM組件是遵循COM規範編寫的 COM組件是一些小的二進制可執行文件 COM組件可以給應用程序、操作系統以及其他組件提供服務 自定義的COM組件可以在運行時刻同其他組件連接起來構成某個應用程序 COM組件可以動態的插入或卸出應用 COM組件必須是動態鏈接的 COM組件必須隱藏(封裝)其內部實現細節 COM組件必須將其實現的語言隱藏 COM組件必須以二進制的形式發布 COM組件必須可以在不妨礙已有用戶的情況下被升級 COM組件可以透明的在網絡上被重新分配位置 COM組件按照一種標準的方式來宣布它們的存在

Question: 何時需要建立一個新的COM組件版本?
Answer: 當為已有接口指定新的ID時應該是下面的條件至少有一個成立。 接口中函數的數目發生改變時。 接口中函數的順序發生改變。 接口中某個函數的參數發生改變 接口中某個函數的參數的順序發生改變 接口中某個函數的參數的類型發生改變 接口中函數的返回值發生改變 接口中函數的返回值類型發生改變 接口中函數的參數的含義發生改變 接口中函數的含義發生改變 簡單地說,COM是一種跨應用和語言共享二進制代碼的方法。與C++不同,它提倡源代碼重用。ATL便是一個很好的例證。源碼級重用雖然好,但只能用於C++。它還帶來了名字沖突的可能性,更不用說不斷拷貝重用代碼而導致工程膨脹和臃腫。 Windows使用DLLs在二進制級共享代碼。這也是Windows程序運行的關鍵——重用kernel32.dll,user32.dll等。但DLLs是針對C接口而寫的,它們只能被C或理解C調用規範的語言使用。由編程語言來負責實現共享代碼,而不是由DLLs本身。這樣的話DLLs的使用受到限制。 MFC引入了另外一種MFC擴展DLLs二進制共享機制。但它的使用仍受限制——只能在MFC程序中使用。 COM通過定義二進制標準解決了這些問題,即COM明確指出二進制模塊(DLLs和EXEs)必須被編譯成與指定的結構匹配。這個標準也確切規定了在內存中如何組織COM對象。COM定義的二進制標準還必須獨立於任何編程語言(如C++中的命名修飾)。一旦滿足了這些條件,就可以輕松地從任何編程語言中存取這些模塊。由編譯器負責所產生的二進制代碼與標準兼容。這樣使後來的人就能更容易地使用這些二進制代碼。 在內存中,COM對象的這種標準形式在C++虛函數中偶爾用到,所以這就是為什麽許多COM代碼使用C++的原因。但是記住,編寫模塊所用的語言是無關的,因為結果二進制代碼為所有語言可用。 此外,COM不是Win32特有的。從理論上講,它可以被移植到Unix或其它操作系統。但是我好像還從來沒有在Windows以外的地方聽說過COM。

.net組件和com組件&托管代碼和非托管代碼