指定輸入的 c # 編譯器選項

下列選項會控制編譯器輸入。 新的 MSBuild 語法會以粗體顯示。 舊版的 csc.exe 語法如下所示

  • 引用-reference-references :從指定的元件檔案參考中繼資料。
  • AddModules-addmodule :將使用 target:module 建立的模組 (新增至此元件。 )
  • EmbedInteropTypes-link :從指定的 interop 元件檔內嵌中繼資料。

參考資料

References選項會讓編譯器將指定檔案中的公用類型資訊匯入至目前的專案,讓您可以從指定的元件檔案參考中繼資料。

<Reference Include="filename" />

filename 這是包含組件資訊清單的檔案名。 若要匯入多個檔案,請為每個檔案包含個別的 Reference 元素。 您可以將別名定義為 參考 專案的子項目:

<Reference Include="filename.dll">
  <Aliases>LS</Aliases>
</Reference>

在上述範例中, LS 是有效的 c # 識別碼,代表將包含元件 LS中所有命名空間的根命名空間。 您匯入的檔案必須包含資訊清單。 使用 AdditionalLibPaths 來指定一個或多個元件參考所在的目錄。 AdditionalLibPaths主題也會討論編譯器在其中搜尋元件的目錄。 為了讓編譯器可以辨識位於組件中的類型 (而不是模組中),您必須定義類型的執行個體,以強制讓編譯器解析類型。 您也可以使用其他方法,讓編譯器解析組件中的類型名稱:例如,您可以繼承組件的類型,編譯器即可辨識類型名稱。 有時候,您必須參考組件內相同元件的兩個不同版本。 若要這樣做,請針對每個檔案使用References元素上的 [別名] 專案,以區分這兩個檔案。 系統會將此別名作為元件名稱的限定詞,並將元件解析為其中一個檔案。

注意

在 Visual Studio 中,使用 [加入參考] 命令。 如需詳細資訊,請參閱 如何:使用參考管理員新增或移除參考

AddModules

此選項會將使用 <TargetType>module</TargetType> 參數建立的模組新增至目前的編譯:

<AddModule Include=file1 />
<AddModule Include=file2 />

file2其中 file 是包含中繼資料的輸出檔案。 檔案不能包含組件資訊清單。 若要匯入多個檔案,請以逗號或分號分隔檔案名稱。 使用 AddModules 新增的所有模組都必須與執行時間的輸出檔案位於相同的目錄中。 也就是說,您可以在編譯時間指定任一目錄中的模組,但該模組於執行階段必須位在應用程式目錄中。 如果模組在執行時間不在應用程式目錄中,您將會得到 TypeLoadExceptionfile 不能包含元件。 例如,如果輸出檔案是使用moduleTargetType選項來建立,則可以使用AddModules匯入其中繼資料。

如果輸出檔案是使用模組以外的TargetType選項所建立,則其中繼資料無法使用AddModules匯入,但可以使用References選項匯入。

EmbedInteropTypes

讓編譯器將所指定組件的 COM 類型資訊全部提供給您目前編譯的專案。

<References>
  <EmbedInteropTypes>file1;file2;file3</EmbedInteropTypes>
</References>

其中 file1;file2;file3 是元件檔案名的分號分隔清單。 如果檔案名稱包含空格,請用引號括住名稱。 EmbedInteropTypes選項可讓您部署具有內嵌類型資訊的應用程式。 應用程式接著可以使用執行階段組件中實作內嵌類型資訊的類型,而不需要參考執行階段組件。 如果執行階段組件有許多發行版本,包含內嵌類型資訊的應用程式不需要重新編譯,就可以搭配各種版本使用。 如需範例,請參閱 Walkthrough: Embedding Types from Managed Assemblies (逐步解說:從 Managed 組件內嵌類型)。

使用 EmbedInteropTypes 選項在使用 COM interop 時特別有用。 您可以內嵌 COM 類型,如此一來您的應用程式就不會再要求目標電腦上必須有主要 Interop 組件 (PIA)。 EmbedInteropTypes選項會指示編譯器將來自所參考 interop 元件的 COM 類型資訊內嵌到所產生的已編譯器代碼中。 COM 類型是由 CLSID (GUID) 值來識別。 因此,應用程式可以在已安裝含相同 CLSID 值之相同 COM 類型的目標電腦上執行。 自動化 Microsoft Office 的應用程式即為一個很好的例子。 由於 Office 等應用程式通常會在不同版本間保持相同的 CLSID 值,因此只要目標電腦上已安裝 .NET Framework 4 或更新版本,且應用程式使用包含在所參考 COM 類型中的方法、屬性或事件,應用程式就可以使用這些參考的 COM 類型。 EmbedInteropTypes選項只會內嵌介面、結構和委派。 不支援內嵌 COM 類別。

注意

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

如同 references 編譯器選項, EmbedInteropTypes 編譯器選項會使用 Csc 回應檔,其參考常用的 .net 元件。 如果您不想要編譯器使用 Csc 檔案,請使用 NoConfig 編譯器選項。

// 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()
    {
        return null;
    }

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

在下列範例中,用戶端程式碼可以呼叫傳回 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();
    }
}