共用方式為


使用 ClickOnce 部署 COM 元件

傳統上,部署舊版 COM 元件是一項艱鉅的任務。 元件需要全域註冊,因此可能會在重疊的應用之間造成不良副作用。 這種情況在 .NET Framework 應用程式中通常不是問題,因為元件完全隔離到應用程式或並存相容。 Visual Studio 可讓您在 Windows 作業系統上部署隔離的 COM 元件。

ClickOnce 提供簡單且安全的機制來部署 .NET 應用程式。 不過,如果您的應用程式使用舊版 COM 元件,您將需要採取額外的步驟來部署它們。 本主題說明如何部署隔離的 COM 元件,並參考原生元件 (例如,從 Visual Basic 6.0 或 Visual C++) 。

如需部署隔離 COM 元件的詳細資訊,請參閱 使用 ClickOnce 和 Registration-Free COM 簡化應用程式部署

免註冊 COM

免註冊 COM 是部署和啟用隔離 COM 元件的新技術。 其工作原理是將通常安裝到系統登錄中的所有元件類型庫和註冊資訊放入稱為清單的 XML 檔案中,該檔案儲存在與應用程式相同的資料夾中。

隔離 COM 元件需要在開發人員的計算機上註冊,但不需要在使用者的電腦上註冊。 若要隔離 COM 元件,您只需將其參考的 Isolated 屬性設定為 True。 根據預設,此屬性會設定為 False,指出它應該被視為已註冊的 COM 參考。 如果此屬性為 True,則會導致在建置階段為此元件產生資訊清單。 它還會導致在安裝過程中將相應的文件複製到應用程序文件夾中。

當資訊清單產生器遇到隔離的 COM 參考時,它會 CoClass 列舉元件類型程式庫中的所有專案、比對每個專案與其對應的註冊數據,並產生類型程式庫檔案中所有 COM 類別的資訊清單定義。

使用 ClickOnce 部署免註冊 COM 元件

ClickOnce 部署技術非常適合部署隔離的 COM 元件,因為 ClickOnce 和免註冊 COM 都需要元件具有資訊清單才能部署。

一般而言,元件的作者應該提供資訊清單。 不過,如果沒有,Visual Studio 能夠自動產生 COM 元件的資訊清單。 資訊清單產生會在 ClickOnce 發佈程式期間執行;如需詳細資訊,請參閱 發佈 ClickOnce 應用程式。 這項功能也可讓您利用您在舊版開發環境 (例如 Visual Basic 6.0) 中撰寫的舊版元件。

ClickOnce 有兩種方式可以部署 COM 元件:

  • 使用啟動載入器來部署 COM 元件;這適用於所有支援的平台。

  • 使用原生元件隔離(也稱為免註冊 COM)進行部署。

隔離和部署簡單 COM 元件的範例

為了示範免註冊 COM 元件部署,此範例將在 Visual Basic 中建立 Windows 型應用程式,該應用程式會參考使用 Visual Basic 6.0 建立的隔離原生 COM 元件,並使用 ClickOnce 進行部署。

首先,您必須建立原生 COM 元件:

建立原生 COM 元件
  1. 使用 Visual Basic 6.0,從 [檔案] 功能表中,按一下 [新增],然後按一下 [專案]。

  2. 在 [ 新增專案 ] 對話方塊中,選取 Visual Basic 節點,然後選取 ActiveX DLL 專案。 在 名稱 方塊中,輸入 VB6Hello

    備註

    免註冊 COM 僅支援 ActiveX DLL 和 ActiveX 控制項專案類型;不支援 ActiveX EXE 和 ActiveX 文件專案類型。

  3. [方案總管] 中,按兩下 Class1.vb 以開啟文字編輯器。

  4. 在Class1.vb中,在方法產生 New 的程式碼之後新增下列程式碼:

    Public Sub SayHello()
       MsgBox "Message from the VB6Hello COM component"
    End Sub
    
  5. 建置元件。 從 建置 功能表中,按一下 建置解決方案

備註

免註冊 COM 僅支援 DLL 和 COM 控制項專案類型。 您無法將 EXE 與免註冊 COM 搭配使用。

現在您可以建立 Windows 型應用程式,並將 COM 元件的參考新增至其中。

使用 COM 元件建立 Windows 型應用程式
  1. 使用 Visual Basic,從 [檔案] 功能表中,按一下 [新增],然後按一下 [專案]。

  2. 在 [ 新增專案 ] 對話方塊中,選取 [Visual Basic ] 節點,然後選取 [Windows 應用程式]。 在 名稱 方塊中,輸入 RegFreeComDemo

  3. [方案總管] 中,按一下 [顯示所有檔案 ] 按鈕以顯示專案參考。

  4. 「參考」節點上按一下滑鼠右鍵,然後從內容功能表中選取「新增參考」。

  5. 「新增參考 」對話方塊中,按一下「 瀏覽 」標籤,導覽至 VB6Hello.dll,然後選取它。

    VB6Hello 參考會出現在參考清單中。

  6. 指向 [工具箱],選取 [按鈕] 控制項,然後將它拖曳至 [Form1 ] 表單。

  7. [屬性] 視窗中,將按鈕的 [文字] 屬性設定為 Hello

  8. 雙擊按鈕以新增處理程序碼,然後在程式檔中新增程式碼,使處理程序碼讀起來如下:

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim VbObj As New VB6Hello.Class1
        VbObj.SayHello()
    End Sub
    
  9. 執行應用程式。 從 [偵錯] 功能表中,按一下 [開始偵錯]。

    接下來,您需要隔離控制項。 應用程式使用的每個 COM 元件都會在您的專案中表示為 COM 參考。 這些參考會顯示在 [方案總管] 視窗的 [參考] 節點下。 (請注意,您可以使用 [專案] 功能表上的 [新增參考] 命令直接新增參考,或將 ActiveX 控制項拖曳到表單上來間接新增參考。

    下列步驟示範如何隔離 COM 元件,並發佈包含隔離控制項的更新應用程式:

隔離 COM 元件
  1. [方案總管] 的 [參考] 節點中,選取 VB6Hello 參考。

  2. [屬性] 視窗中,將 Isolated 屬性的值從 False 變更為 True

  3. 建置 功能表中,按一下 建置解決方案

    現在,當您按 F5 時,應用程式會如預期般運作,但它現在是在免註冊 COM 下執行。 為了證明這一點,請嘗試取消註冊 VB6Hello.dll 元件並在 Visual Studio IDE 外部執行 RegFreeComDemo1.exe。 這次點擊按鈕時,它仍然有效。 如果您暫時重新命名應用程式資訊清單,它會再次失敗。

備註

您可以暫時取消註冊 COM 元件,以模擬 COM 元件的缺失。 開啟命令提示字元,鍵入 cd /d %windir%\system32移至系統資料夾,然後鍵入 regsvr32 /u VB6Hello.dll取消註冊元件。 您可以透過鍵入 regsvr32 VB6Hello.dll重新註冊。

最後一個步驟是使用 ClickOnce 發佈應用程式:

使用隔離的 COM 元件發佈應用程式更新
  1. [建置] 功能表中,按一下 [發佈 RegFreeComDemo]。

    「發佈精靈」隨即出現。

  2. 在 [發佈精靈] 中,指定本機電腦磁碟上的位置,您可以在其中存取和檢查已發佈的檔案。

  3. 按一下 完成 以發佈應用程式。

    如果您檢查已發佈的檔案,您會注意到包含 sysmon.ocx 檔案。 控件完全隔離至此應用程式,這表示如果使用者的計算機有另一個應用程式使用不同版本的控件,則無法干擾此應用程式。

參考原生組件

Visual Studio 支援原生 Visual Basic 6.0 或 C++ 元件的參考;這類參照稱為原生參照。 您可以確認參考的 檔案類型 屬性已設定為 [原生 ] 或 [ActiveX],以判斷參考是否為原生。

若要新增原生參照,請使用 [新增參照] 命令,然後瀏覽至資訊清單。 某些元件會將資訊清單放在 DLL 內。 在此情況下,您只需選擇 DLL 本身,如果 Visual Studio 偵測到元件包含內嵌資訊清單,就會將其新增為原生參考。 如果資訊清單中列出的任何相依檔案或元件與參考元件位於相同的資料夾中,Visual Studio 也會自動包含資訊清單中列出的任何相依檔案或元件。

COM 控制項隔離可讓您輕鬆部署尚未有資訊清單的 COM 元件。 不過,如果元件隨資訊清單提供,您可以直接參考資訊清單。 事實上,您應該盡可能使用元件作者所提供的資訊清單,而不是使用 Isolated 屬性。

免註冊 COM 元件部署的限制

與傳統部署技術相比,免註冊 COM 具有明顯的優勢。

並非每個元件都適合使用免註冊 COM。 如果符合下列任一條件,則元件不適合:

  • 元件是進程外伺服器。 不支援 EXE 伺服器;僅支援 DLL。

  • 元件是作業系統的一部分,或是系統元件,例如 XML、瀏覽器元件或 Microsoft 資料存取元件 (MDAC)。 您應該遵循元件作者的重新配送原則;請諮詢您的供應商。

  • 元件是應用程式的一部分,例如 Microsoft Office。 例如,您不應該嘗試隔離 Microsoft Excel 物件模型。 這是 Office 的一部分,只能在安裝完整 Office 產品的電腦上使用。

  • 元件旨在用作增益集或插件,例如 Office 增益集或瀏覽器控制項。 這類元件通常需要某種由主機環境定義的註冊配置,該配置超出資訊清單本身的範圍。

  • 元件會管理系統的實體或虛擬裝置,例如列印多任務緩衝處理程式的裝置驅動程式。

  • 元件是數據存取可重分發。 資料應用程式通常需要先安裝個別的資料存取可轉散發套件,才能執行。 您不應該嘗試隔離元件,例如 Microsoft ADO 資料控制項、Microsoft OLE DB 或 Microsoft 資料存取元件 (MDAC)。 相反地,如果您的應用程式使用 MDAC 或 SQL Server Express,您應該將它們設定為必要條件;請參閱 如何:使用 ClickOnce 應用程式安裝必要條件

    在某些情況下,元件的開發人員可能會針對免註冊 COM 重新設計它。 如果無法做到這一點,您仍然可以使用 Bootstrapper 透過標準註冊配置來建置和發佈相依於它們的應用程式。 如需詳細資訊,請參閱 建立啟動載入器套件

    每個應用程式只能隔離一次 COM 元件。 例如,您無法將相同的 COM 元件與屬於相同應用程式的兩個不同 類別庫 專案隔離。 這樣做會導致組建警告,而且應用程式將無法在執行階段載入。 為了避免此問題,Microsoft 建議您將 COM 元件封裝在單一類別庫中。

    在數種案例中,開發人員的計算機上需要 COM 註冊,即使應用程式的部署不需要註冊也一樣。 屬性 Isolated 需要在開發人員的計算機上註冊 COM 元件,才能在建置期間自動產生資訊清單。 在建置期間,沒有觸發自我註冊的註冊捕捉功能。 此外,類型程式庫中未明確定義的任何類別都不會反映在資訊清單中。 將 COM 元件與預先存在的資訊清單搭配使用時,例如原生參考,元件可能不需要在開發階段註冊。 不過,如果元件是 ActiveX 控制項,而且您想要將它包含在 [工具箱 ] 和 Windows Forms 設計工具中,則需要註冊。