Share via


/link (C# 編譯器選項)

讓編譯器允許您目前正在編譯的專案使用指定組件中的 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)、事件或方法。

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

/link 的簡短形式為 /l。

泛型和內嵌型別

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

泛型介面

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

// The following code causes an error if ISampleInterface is an embedded interop type.
ISampleInterface<SampleType> sample;

具有泛型參數的型別

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;

public class Utility
{
    // The following code causes an error when called by a client assembly.
    public List<Range> GetRange1() {


...


}

// The following code is valid for calls from a client assembly.
public IList<Range> GetRange2() {


...


    }
}

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

public class Client
{
    public void Main()
    {
        Utility util = new Utility();

        // The following code causes an error.
        List<Range> rangeList1 = util.GetRange1();

        // The following code is valid.
        List<Range> rangeList2 = (List<Range>)util.GetRange2();
    }
}

範例

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

csc /link:COMData1.dll,COMData2.dll /out:OfficeApp.exe OfficeApp.cs

請參閱

工作

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

參考

/reference (C# 編譯器選項)

/noconfig (C# 編譯器選項)

互通性概觀 (C# 程式設計手冊)

概念

使用 csc.exe 建置命令列

其他資源

C# 編譯器選項