/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 型別的應用程式中使用泛型型別時的限制。
泛型介面
無法使用從 Interop 組件內嵌的泛型介面。 這在下列範例中顯示。
' The following code causes an error if ISampleInterface is an embedded interop type.
Dim sample As ISampleInterface(Of SampleType)
具有泛型參數的型別
如果具有泛型參數的型別來自外部組件,且其參數的型別是從 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)