簡體   English   中英

構建DLL時,COM如何補充.NET Framework?

[英]How does COM complement the .NET Framework when building DLLs?

在過去的幾周中,我一直在為Excel創建自定義DLL擴展,該擴展是用C#編寫的,並通過Visual Studio啟用了COM互操作,從而構建為COM對象。 DLL本身工作正常,但我想了解其背后的技術。

在閱讀了幾篇文章和帖子后,我感到相當困惑,並且似乎找不到確切說明COM和.NET Framework如何一起工作以允許我們構建這些DLL的信息,以及為什么同時需要它們。

我目前的理解:

COM-一種創建與語言無關的二進制對象的方法,可以在不同的環境中使用。 (例如,編寫一個C#對象,將其構建為COM對象,然后可以在Excel的VB腳本中使用它)

.NET Framework-一個框架,為所有受支持的語言提供通用的運行時環境,並允許它們之間的語言互操作性。 (換句話說,由於CLR,VB腳本可以使用C#對象)

混亂:

在一篇文章中,COM是.NET Framework的前身,它要求開發人員提供很多額外的邏輯來管理其代碼(COM =>非托管代碼)。 .NET Framework現在已經解決了這一問題,並且具有一種處理非托管代碼的方式,就好像它是.NET Framework下的托管代碼一樣。

如果COM和.NET Framework對象在技術上是跨語言兼容的,為什么我們不能簡單地使用Visual Studio來構建C#DLL,進行構建並在Excel中將其作為加載項引用呢? 如果.NET框架應該已經提供了這種語言的互操作性和所有代碼管理功能,為什么我們需要將程序集注冊為COM對象並為COM互操作啟用它?

如果您能真正解釋這兩種技術之間的關系,以及Visual Studio中“使程序集COM可見”和“注冊COM互操作”設置如何與它們緊密結合在一起,也許是最好的選擇。

謝謝,迪米塔爾

編輯:

更新04/22/19:

閱讀以下您的反饋后,我得到以下信息:

  1. COM允許DLL通過實現一些特定的接口/方法來公開其組件

  2. Excel僅支持COM,因此盡管是.NET應用程序,但它僅適用於COM對象。

  3. .NET為無法直接與.NET組件一起使用的Excel等應用程序提供COM互操作

  4. COM可見設置告訴COM您希望對象可用於COM的哪些部分。 COM互操作使用必要的接口/方法來裝飾C#對象,以使其可被COM使用。

我仍然需要澄清的事情:

1.如果未啟用COM,Visual Studio中的C#對象是否被視為.NET組件? 我想是的。

2.COM interop是將Excel變成.NET應用程序的主要功能嗎?

  1. 與Excel不同,.COM互操作是否還允許不依賴COM的.NET應用程序也使用COM對象?

  2. 語言中和到底是什么? COM或.NET? 怎么樣?

COM是一種較老的技術,在.NET之前存在很久,它是由MS創建的,用於允許DLL公開其組件,而調用者則可以簡單地查詢加載的組件是否實現了調用者正在尋找的特定接口。

每個COM庫或對象都至少實現一個稱為IUnknowk接口,可以使用一種稱為QueryInterface的方法來檢查該對象是否實現了特定的接口。

當MS在2001年推出.NET Framework時,它決定從設計開始就支持從第一天開始,並且原生支持稱為COM / .NET互操作性的范例,這意味着從.NET您可以使用COM庫,也可以通過選擇COM來支持項目屬性中的Interop標志使您可以使用.NET編譯器用COM所需的額外零件來裝飾程序集; 例如IUnknown和QueryInterface屬性。

然后,Excel和任何其他COM使用者可以使用該方法在啟用COM的.NET程序集中查找對象和方法。

由於Excel COM加載程序(或VBA或VB腳本語言)早於.NET,因此這些工具無法原生找到.NET對象,因為這些對象僅設計為使用COM,因此需要查找iUnknown接口等。

希望對您有幫助,在線有很多有關此問題的文檔,例如此處

https://docs.microsoft.com/zh-cn/dotnet/visual-basic/programming-guide/com-interop/index

而且還取決於我對您感興趣的方面

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM