共用方式為


/link (Visual Basic)

讓編譯器允許您目前正在編譯的專案使用指定組件中的 COM 型別資訊。

/link:fileList
' -or-
/l:fileList

引數

詞彙

定義

fileList

必要項。逗號分隔的組件檔名清單。如果檔案名稱包含空格,請將名稱加上雙引號 (" ")。

備註

/link 可讓您部署具有內嵌型別資訊的應用程式。應用程式因此可以使用實作內嵌型別資訊之執行階段組件中的型別,而不需要參考執行階段組件。如果執行階段組件有許多發行版本,包含內嵌型別資訊的應用程式就可以在沒有重新編譯的情況下,使用各種版本的組件。如需範例,請參閱 逐步解說:從 Managed 組件內嵌型別 (C# 和 Visual Basic)

當您在使用 COM Interop 時,使用 /link 選項會特別有用。您可以內嵌 COM 型別,這樣目標電腦便不再需要主要 Interop 組件 (PIA),同時也能執行應用程式。/link 選項會指示編譯器將所參考 Interop 組件的 COM 型別資訊內嵌至編譯產生的程式碼中。COM 型別是由 CLSID (GUID) 值來識別。因此,應用程式可以在已安裝含相同 CLSID 值之相同 COM 型別的目標電腦上執行。自動化 Microsoft Office 的應用程式是很好的範例。像 Office 這樣的應用程式通常會在不同版本間保持相同的 CLSID 值,因此只要目標電腦上有安裝 .NET Framework 4 (含) 以後版本,且應用程式使用包含在所參考 COM 型別中的方法、屬性或事件,應用程式就可以使用這些參考的 COM 型別。

/link 選項只能內嵌介面、結構和委派,不支援內嵌 COM 類別。

注意事項注意事項

當您在程式碼中建立內嵌 COM 型別的執行個體時,必須使用適當的介面來建立執行個體。嘗試使用 CoClass 建立內嵌 COM 型別的執行個體將會導致錯誤。

若要設定 Visual Studio 中的 /link 選項,請加入組件參考,並將 Embed Interop Types 屬性設定為 true。Embed Interop Types 屬性的預設值為 false

當連結至本身參考其他 COM 組件 (B 組件) 的 COM 組件 (A 組件) 時,如果符合下列任一情況,您也必須連結至 B 組件:

  • 來自 A 組件的型別繼承自某個型別,或是從 B 組件實作介面。

  • 從 B 組件叫用 (Invoke) 具有傳回型別或參數型別的欄位、屬性 (Property)、事件或方法。

請使用 /libpath 指定一個或多個組件參考所在的目錄。

如同 /reference 編譯器選項,/link 編譯器選項也會使用參考常用 .NET Framework 組件的 Vbc.rsp 回應檔。如果您不要讓編譯器使用 Vbc.rsp 檔,請使用 /noconfig 編譯器選項。

/link 的簡短形式為 /l。

泛型和內嵌型別

下列章節將說明在內嵌 Interop 型別的應用程式中使用泛型型別時的限制。

Dd293566.collapse_all(zh-tw,VS.110).gif泛型介面

無法使用從 Interop 組件內嵌的泛型介面。這在下列範例中顯示。

' The following code causes an error if ISampleInterface is an embedded interop type.
Dim sample As ISampleInterface(Of SampleType)

Dd293566.collapse_all(zh-tw,VS.110).gif具有泛型參數的型別

如果具有泛型參數的型別來自外部組件,且其參數的型別是從 Interop 組件內嵌的,則無法使用該型別。這項限制不適用於介面。例如,試想在 Microsoft.Office.Interop.Excel 組件中定義的 Range 介面。如果程式庫內嵌來自 Microsoft.Office.Interop.Excel 組件的 Interop 型別,並公開傳回泛型型別的方法,但是此泛型型別具有型別為 Range 介面的參數,那麼這個方法就必須傳回泛型介面,如下列程式碼範例所示。

Imports System.Collections.Generic
Imports Microsoft.Office.Interop.Excel

Class Utility
    ' The following code causes an error when called by a client assembly.
    Public Function GetRange1() As List(Of Range)


...


End Function

' The following code is valid for calls from a client assembly.
Public Function GetRange2() As IList(Of Range)


...


    End Function
End Class

在下列範例中,用戶端程式碼可以呼叫傳回 IList 泛型介面的方法,且不會發生錯誤。

Module Client
    Public Sub Main()
        Dim util As New Utility()

        ' The following code causes an error.
        Dim rangeList1 As List(Of Range) = util.GetRange1()

        ' The following code is valid.
        Dim rangeList2 As List(Of Range) = CType(util.GetRange2(), List(Of Range))
    End Sub
End Module

範例

下列程式碼會編譯原始程式檔 OfficeApp.vb,並參考 COMData1.dll 和 COMData2.dll 中的組件來產生 OfficeApp.exe。

vbc /link:COMData1.dll,COMData2.dll /out:OfficeApp.exe OfficeApp.vb

請參閱

工作

逐步解說:從 Managed 組件內嵌型別 (C# 和 Visual Basic)

參考

/reference (Visual Basic)

/noconfig

/libpath

編譯命令列範例 (Visual Basic)

概念

COM Interop 簡介 (Visual Basic)

其他資源

Visual Basic 命令列編譯器