Možnosti kompilátoru C#, které určují vstupy
Následující možnosti řídí vstupy kompilátoru. nová syntaxe MSBuild je zobrazena tučně. Starší syntaxe csc.exe se zobrazuje v .
- Odkazy
-referencenebo-references: odkazuje na metadata ze zadaného souboru sestavení nebo souborů. - AddModules
-addmodule: Přidejte modul (vytvořený pomocítarget:moduledo tohoto sestavení). - EmbedInteropTypes
-link: vložit metadata ze zadaných souborů sestavení spolupráce
Reference
Možnost reference způsobí, že kompilátor importuje informace o veřejném typu v zadaném souboru do aktuálního projektu a umožní vám 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ý odkazový prvek pro každý soubor. Alias můžete definovat jako podřízený element elementu reference :
<Reference Include="filename.dll">
<Aliases>LS</Aliases>
</Reference>
V předchozím příkladu LS je platný identifikátor jazyka C#, který představuje kořenový obor názvů, který bude obsahovat všechny obory názvů v sestavení LS. 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 vyhledává sestavení. Aby mohl kompilátor rozpoznat typ v sestavení a ne v modulu, musí být vynucen přeložit typ, který lze provést definováním instance typu. Existují i jiné způsoby, jak přeložit názvy typů v sestavení pro kompilátor: například Pokud převezmete z typu v sestavení, název typu bude rozpoznán kompilátorem. V některých případech je nutné odkazovat na dvě různé verze stejné komponenty z jednoho sestavení. Chcete-li to provést, použijte element aliasy v elementu References pro každý soubor pro rozlišení mezi dvěma soubory. Tento alias bude použit jako kvalifikátor pro název součásti a bude přeložen na součást v jednom ze souborů.
Poznámka
v Visual Studio použijte příkaz přidat odkaz . Další informace najdete v tématu Postupy: Přidání nebo odebrání odkazů pomocí Správce odkazů.
AddModules
Tato možnost přidá modul, který byl vytvořen s <TargetType>module</TargetType> přepínačem na aktuální kompilaci:
<AddModule Include=file1 />
<AddModule Include=file2 />
file2Kde file jsou výstupní soubory obsahující metadata. Soubor nemůže obsahovat manifest sestavení. Chcete-li 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 v době běhu. To znamená, že můžete určit modul v jakémkoli adresáři v době kompilace, ale modul musí být v adresáři aplikace v době běhu. Pokud modul není v adresáři aplikace v době běhu, získáte TypeLoadException . file nemůže obsahovat sestavení. Například pokud byl výstupní soubor vytvořen s parametrem TargetTypemodulu, jeho metadata lze importovat pomocí AddModules.
Pokud byl výstupní soubor vytvořen s parametrem TargetType jiným než modul, jeho metadata nelze importovat s AddModules , ale lze je importovat s možností odkazy .
EmbedInteropTypes
Způsobí, že kompilátor zpřístupní informace o typu 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íky. Pokud název souboru obsahuje mezeru, uzavřete název do uvozovek. Možnost EmbedInteropTypes umožňuje nasadit aplikaci, která obsahuje informace o vloženém typu. Aplikace pak může použít typy v sestavení modulu runtime, které implementuje vložené informace o typu bez nutnosti odkazování na sestavení modulu 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é je znovu zkompilovat. Příklad naleznete v tématu Návod: Vložení typů ze spravovaných sestavení.
Použití možnosti EmbedInteropTypes je zvlášť užitečné, když pracujete se zprostředkovatelem komunikace s objekty com. Můžete vložit typy modelu COM, aby již aplikace nevyžadovala primární definiční sestavení (PIA) v cílovém počítači. Možnost EmbedInteropTypes instruuje kompilátor, aby vložil informace o typu modelu COM z odkazovaného definičního sestavení do výsledného zkompilovaného kódu. Typ COM je identifikovaný hodnotou CLSID (GUID). V důsledku toho může být aplikace spuštěna na cílovém počítači, který má nainstalované stejné typy COM se stejnými hodnotami CLSID. dobrým příkladem jsou aplikace, které automatizují Microsoft Office. vzhledem k tomu, že aplikace jako Office obvykle udržují stejnou hodnotu CLSID napříč různými verzemi, může vaše aplikace používat odkazované typy COM, pokud je v cílovém počítači nainstalována .NET Framework 4 nebo novější a vaše aplikace používá metody, vlastnosti nebo události, které jsou zahrnuty v odkazovaných typech COM. Možnost EmbedInteropTypes vloží pouze rozhraní, struktury a delegáty. Vložení tříd modelu COM není podporováno.
Poznámka
Při vytváření instance vloženého typu modelu COM v kódu, je nutné vytvořit instanci pomocí příslušného rozhraní. Při pokusu o vytvoření instance vloženého typu modelu COM pomocí třídy coclass dojde k chybě.
Podobně jako u možnosti kompilátoru reference používá možnost kompilátoru EmbedInteropTypes soubor odpovědí 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- config .
// 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ý ze sestavení vzájemné spolupráce, se nedají použít, pokud je tento typ z externího sestavení. Toto omezení se nevztahuje na rozhraní. Zvažte Range například rozhraní, které je definováno v Microsoft.Office.Interop.Excel sestavení. Pokud knihovna vloží typy spolupráce ze Microsoft.Office.Interop.Excel sestavení a zpřístupní metodu, která vrátí obecný typ s parametrem, jehož typ je Range rozhraní, musí tato metoda vracet 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 kód klienta může zavolat metodu, která vrátí 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();
}
}