Možnosti kompilátoru jazyka C# určující vstupy

Následující možnosti řídí vstupy kompilátoru. Nová syntaxe nástroje MSBuild je zobrazena tučně. Starší syntaxe csc.exe je zobrazena v code stylesouboru .

  • Odkazy nebo -references: Referenční-reference / metadata ze zadaného souboru sestavení nebo souborů.
  • AddModules-addmodule / : Přidejte modul (vytvořený pomocí target:module tohoto sestavení.)
  • EmbedInteropTypes / -link: Vložte metadata ze zadaných souborů sestavení vzájemné spolupráce.

Reference

Možnost Odkazy způsobí, že kompilátor naimportuje informace o veřejném typu do zadaného souboru do aktuálního projektu a umožní odkazovat na metadata ze zadaných souborů sestavení.

<Reference Include="filename" />

filename je název souboru, který obsahuje manifest sestavení. Chcete-li importovat více než jeden soubor, zahrňte samostatný referenční prvek pro každý soubor. Alias můžete definovat jako podřízený prvek elementu Reference :

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

V předchozím příkladu je platný identifikátor jazyka C#, LS který představuje kořenový obor názvů, který bude obsahovat všechny obory názvů v sestavení filename.dll. Importovaná soubory musí obsahovat manifest. Pomocí additionalLibPaths určete adresář, ve kterém je umístěn jeden nebo více odkazů na sestavení. Téma AdditionalLibPaths také popisuje adresáře, ve kterých kompilátor hledá sestavení. Aby kompilátor rozpoznal typ v sestavení, a ne v modulu, musí být nucen přeložit typ, který můžete provést definováním instance typu. Existují další způsoby překladu názvů typů v sestavení kompilátoru: například pokud dědíte z typu v sestavení, název typu pak kompilátor rozpozná. Někdy je nutné odkazovat na dvě různé verze stejné komponenty z jednoho sestavení. Uděláte to tak, že pro každý soubor použijete element Aliases pro každý soubor k rozlišení mezi těmito dvěma soubory. Tento alias se použije jako kvalifikátor názvu komponenty a přeloží se na komponentu v některém ze souborů.

Poznámka:

V sadě Visual Studio použijte příkaz Přidat odkaz . Další informace naleznete v tématu Postupy: Přidání nebo odebrání odkazů pomocí Správce odkazů.

AddModules

Tato možnost přidá modul vytvořený pomocí <TargetType>module</TargetType> přepínače na aktuální kompilaci:

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

Kde filejsou file2 výstupní soubory, které obsahují metadata. Soubor nemůže obsahovat manifest sestavení. Pokud chcete importovat více než jeden soubor, oddělte názvy souborů čárkou nebo středníkem. Všechny moduly přidané pomocí AddModules musí být ve stejném adresáři jako výstupní soubor za běhu. To znamená, že modul můžete zadat v libovolném adresáři v době kompilace, ale modul musí být v adresáři aplikace za běhu. Pokud modul není v adresáři aplikace za běhu, získáte TypeLoadException. file nemůže obsahovat sestavení. Pokud byl například výstupní soubor vytvořen s možností TargetType modulu, lze jeho metadata importovat pomocí AddModules.

Pokud byl výstupní soubor vytvořen s jinou možností TargetType než modul, jeho metadata nelze importovat pomocí AddModules, ale lze importovat pomocí možnosti Reference.

EmbedInteropTypes

Způsobí, že kompilátor zpřístupní informace o typu MODELU COM v zadaných sestaveních pro projekt, který právě kompilujete.

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

Kde file1;file2;file3 je seznam názvů souborů sestavení oddělených středníkem. Pokud název souboru obsahuje mezeru, uzavřete ho do uvozovek. Možnost EmbedInteropTypes umožňuje nasadit aplikaci s vloženými informacemi o typu. Aplikace pak může používat typy v sestavení modulu runtime, které implementují vložené informace o typu, aniž by vyžadovala odkaz na sestavení runtime. Pokud jsou publikovány různé verze sestavení modulu runtime, aplikace, která obsahuje informace o vloženém typu, může pracovat s různými verzemi, aniž by bylo nutné překompilovat. Příklad najdete v části Návod: Vkládání typů ze spravovaných sestavení.

Použití možnosti EmbedInteropTypes je zvlášť užitečné, když pracujete s interoperabilitou modelu COM. Typy modelu COM můžete vložit tak, aby vaše aplikace už na cílovém počítači nepoužíla primární sestavení interop (PIA). Možnost EmbedInteropTypes dává kompilátoru pokyn, aby vložil informace o typu modelu COM z odkazovaného sestavení zprostředkovatele komunikace do výsledného kompilovaného kódu. Typ MODELU COM je identifikován hodnotou CLSID (GUID). V důsledku toho může vaše aplikace běžet na cílovém počítači, který nainstaloval stejné typy modelu COM se stejnými hodnotami CLSID. Dobrým příkladem jsou aplikace, které automatizují systém Microsoft Office. Vzhledem k tomu, že aplikace, jako je Office, obvykle udržují stejnou hodnotu CLSID v různých verzích, může vaše aplikace používat odkazované typy modelu COM, pokud je v cílovém počítači nainstalovaná rozhraní .NET Framework 4 nebo novější a vaše aplikace používá metody, vlastnosti nebo události, které jsou zahrnuté v odkazovaných typech modelu COM. Možnost EmbedInteropTypes vloží pouze rozhraní, struktury a delegáty. Vkládání tříd modelu COM se nepodporuje.

Poznámka:

Když ve svém kódu vytvoříte instanci vloženého typu MODELU COM, musíte instanci vytvořit pomocí příslušného rozhraní. Pokus o vytvoření instance vloženého typu MODELU COM pomocí třídy CoClass způsobí chybu.

Podobně jako možnost kompilátoru Odkazů používá možnost kompilátoru EmbedInteropTypes soubor odpovědi Csc.rsp, který odkazuje na často používaná sestavení .NET. Pokud nechcete, aby kompilátor používal soubor Csc.rsp, použijte možnost kompilátoru NoConfig.

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

Typy, které mají obecný parametr, jehož typ je vložen z sestavení vzájemné spolupráce, nelze použít, pokud je tento typ z externího sestavení. Toto omezení neplatí pro rozhraní. Představte si Range například rozhraní, které je definováno Microsoft.Office.Interop.Excel v sestavení. Pokud knihovna vkládá typy Microsoft.Office.Interop.Excel z sestavení a zveřejňuje metodu, která vrací obecný typ, který má parametr, jehož typ je Range rozhraní, musí tato metoda vrátit obecné rozhraní, jak je znázorněno v následujícím příkladu kódu.

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;
    }
}

V následujícím příkladu může kód klienta volat metodu, která vrací IList obecné rozhraní bez chyby.

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();
    }
}