讓編譯程式在指定的元件中,將 COM 類型資訊提供給您目前正在編譯的專案使用。
語法
-link:fileList
或
-l:fileList
論點
| 術語 | 定義 |
|---|---|
fileList |
必須的。 元件檔名的逗號分隔清單。 如果檔名包含空格,請以引弧括住名稱。 |
備註
選項 -link 可讓您部署具有內嵌類型資訊的應用程式。 然後,應用程式可以在運行時間元件中使用類型,以實作內嵌類型資訊,而不需要參考運行時間元件。 如果發佈各種版本的運行時間元件,包含內嵌類型資訊的應用程式可以使用各種版本,而不需要重新編譯。 如需範例,請參閱 逐步解說:從 Managed 元件內嵌類型。
-link當您使用 COM Interop 時,使用 選項特別有用。 您可以內嵌 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 元件 (Assembly B) 的 COM 元件 (Assembly A),則如果下列任一項成立,您也必須連結到元件 B:
元件 A 的型別繼承自型別,或從元件 B 實作介面。
從元件 B 叫用具有傳回型別或參數型別的欄位、屬性、事件或方法。
使用 -libpath 指定一或多個元件參考所在的目錄。
如同 -reference 編譯程式選項,編譯程式選項會 -link 使用 Vbc.rsp 回應檔,該檔案會參考經常使用的 .NET Framework 元件。 如果您不想讓編譯程式使用 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 元件。 這項限制不適用於介面。 例如,請考慮 Range 元件中 Microsoft.Office.Interop.Excel 定義的介面。 如果連結庫從 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
範例
下列命令列會從和 COMData2.dll 編譯原始程式檔OfficeApp.vb和參考元件COMData1.dll,以產生 OfficeApp.exe。
vbc -link:COMData1.dll,COMData2.dll -out:OfficeApp.exe OfficeApp.vb