Deploy COM components with ClickOnce (使用 ClickOnce 部署 COM 元件)

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

ClickOnce 提供簡單且安全的機制來部署 .NET 應用程式。 不過,如果您的應用程式使用舊版 COM 元件,您必須採取其他步驟來部署應用程式。 本主題描述如何部署隔離的 COM 元件和參考原生元件 (例如,從 Visual Basic 6.0 或 Visual C++)。

如需部署隔離 COM 元件的詳細資訊,請參閱使用 ClickOnce 和免註冊 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 控制項專案類型。 您無法搭配免註冊 COM 使用 EXE。

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

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

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

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

  4. 以滑鼠右鍵按一下 [參考] 節點,然後從捷徑功能表中選取 [新增參考]

  5. 在 [新增參考] 對話方塊中,按一下 [瀏覽] 索引標籤,瀏覽至 VB6Hello.dll,然後選取它。

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

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

  7. 在 [屬性] 視窗中,將按鈕的 Text 屬性設定為 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++ 組件的參考;此類參考稱為原生參考。 您可以確認參考的 File Type 屬性設定為 NativeActiveX,以判斷參考是否為原生。

若要新增原生參考,請使用 [新增參考] 命令,然後瀏覽至資訊清單。 某些元件會將資訊清單放在 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。 如果無法這樣做,您仍然可以使用啟動載入器並透過標準註冊配置來建置和發佈相依的應用程式。 如需詳細資訊,請參閱建立啟動載入器套件

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

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