Com組件和dll區別:
1.普通dll不能通過regsvr32.exe來注冊,而Com組件能通過regsvr32.exe注冊。
2.Com組件是微軟的一個協議,滿足com組件協議的dll文件就是com組件,這種協議為了跨語言、跨平台使用,dll組件需要編譯后使用,而Com組件注冊后即可使用。
而dll是動態鏈接庫,是一個可以導出函數的集合。
3.Com組件可以是exe也可以是dll文件。
托管dll/Com組件和非托管dll/Com組件:
1.非托管Com組件是用非運行庫代碼編寫的,如C++,用C#編寫的Com組件為托管Com組件,托管Com組件是用.netFramwork運行庫編寫的。
2.COM組件是以前微軟推薦的;
COM組件是非托管對象,可以不需要.net框架而直接運行。
.NET組件是現在微軟推薦的;
.NET組件是托管對象,必須有.net框架才能運行。
托管dll和非托管dll調用方式:
托管dll:Assembly ass = Assembly.LoadFile(dllPath);加載,
非托管: [DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(string path);調用
疑問:
托管的dll一定是Com組件嗎?
錯:托管dll只能說是使用運行庫代碼編寫的dll文件,並非一定是Com組件。
非托管的dll一定不是Com組件嗎?
錯:只用滿足Com協議的就是Com組件,與編寫的語言無關。
C#調用dll方式與是否是Com組件無關?
對:托管dll,目標代碼是C#,使用: Assembly ass = Assembly.LoadFile(dllPath);加載,
非托管dll,目標代碼VB6,C++,使用:
[DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(string path);調用
C:\Windows\Microsoft.NET\Framework\v4.0.30319
注冊Com組件的兩種方式:
RegAsm.exe:托管注冊,使用NET自帶工具用來注冊COM Interop,.NET下注冊Com組件的工具,注冊表允許COM 客戶程序以透明方式創建.NET
Framework類。
regsvr32.exe:非托管注冊,這是用於注冊的COM DLL,也可以理解用於注冊非托管代碼控件注冊為Com組件。
補充說明:
運行庫為目標的代碼稱為托管代碼,而不以運行庫為目標的代碼稱為非托管代碼。
NET Framework 具有兩個主要組件:公共語言運行庫和 .NET Framework 類庫。公共語言運行庫是 .NET Framework 的基礎。
c#寫的Com組件編譯為符合.net標准托管類庫,添加了COM Interop 層代碼。(C#寫的com組件需要注冊后使用,COM當然還是非托管的,但是c#寫的托管代碼是可以通過 COM
接口來調用的。)
E:\DllDemo\DllDemo\DllDemo\bin\Debug:
應用:
C#調用外部Com組件:
步驟1:先判斷是否是Com組件,使用regasm.exe和regsvr32.exe注冊方式判斷是否能注冊(使用RegAsm.exe注意高版本能注冊低版本,低版本不能注冊高版本)
步驟2:判斷是托管Com組件還是非托管Com組件。
步驟3:托管Com組件使用用, Assembly ass = Assembly.LoadFile(dllPath);
非托管使用
[DllImport("Kernel32.dll")]
private static extern IntPtr LoadLibrary(string path);調用
其他網友的補充:
DLL:這個只是程序打包的表現形式,是早期windows為了解決代碼公用而使用的一種技術,這個庫文件只能被調用運行到一個執行文件進程中
COM:主要是為了解決二進制程序間的公用的技術,既可以使用獨立進程COM服務,如Office的COM模型,其他程序可以任意調用;也可以是DLL的形式,運行時需要依賴執行進程,相比DLL有很大的優越性,都是基於接口和系列的規范進行,一定程度上解決了DLL的版本問題
如上在.net時代前,主要是C/C++進行編寫
托管:這個是后來微軟推出.net后,有了.net虛擬環境,因此所有的程序都叫做托管了
托管COM:進入.net時代后,微軟以前的COM技術有大量的歷史遺留軟件,因此為了兼容,必然就有這個托管的COM問題,主要涉及2個方面:托管程序和歷史的COM交互[interop];另外也可以使用C#等托管語言實現COM組件【這種方式不推薦,畢竟是淘汰的技術,.net下完成類似的事情已經提供了更好的手段】