Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die folgenden Optionen steuern Compilereingaben. Die neue MSBuild-Syntax wird fett formatiert dargestellt. Die ältere csc.exe-Syntax wird in code style
dargestellt.
-
Referenzen /
-reference
oder-references
: Verweisen Sie auf Metadaten aus der angegebenen Assemblydatei oder -dateien. -
AddModules: Hinzufügen eines Moduls /
-addmodule
(erstellt mittarget:module
dieser Assembly.) -
EmbedInteropTypes /
-link
: Einbetten von Metadaten aus den angegebenen Interopassemblydateien.
Verweise
Die Option "Verweise " bewirkt, dass der Compiler öffentliche Typinformationen in der angegebenen Datei in das aktuelle Projekt importiert, sodass Sie auf Metadaten aus den angegebenen Assemblydateien verweisen können.
<Reference Include="filename" />
filename
ist der Name einer Datei, die ein Assemblymanifest enthält. Wenn Sie mehrere Dateien importieren möchten, fügen Sie für jede Datei ein separates Reference-Element hinzu. Sie können einen Alias als untergeordnetes Element des Reference-Elements definieren:
<Reference Include="filename.dll">
<Aliases>LS</Aliases>
</Reference>
Im vorherigen Beispiel ist der gültige C#-Bezeichner, der einen Stammnamespace darstellt, LS
der alle Namespaces in der Assembly filename.dllenthält. Die importierten Dateien müssen ein Manifest enthalten. Verwenden Sie AdditionalLibPaths , um das Verzeichnis anzugeben, in dem sich mindestens ein Assemblyverweise befindet. Im Thema "AdditionalLibPaths " werden auch die Verzeichnisse erläutert, in denen der Compiler nach Assemblys sucht. Damit der Compiler einen Typ in einer Assembly und nicht in einem Modul erkennt, muss er gezwungen werden, den Typ aufzulösen, den Sie ausführen können, indem Sie eine Instanz des Typs definieren. Es gibt weitere Möglichkeiten zum Auflösen von Typnamen in einer Assembly für den Compiler: Wenn Sie z. B. von einem Typ in einer Assembly erben, wird der Typname vom Compiler erkannt. Manchmal ist es erforderlich, in einer Assembly auf zwei verschiedene Versionen derselben Komponente zu verweisen. Verwenden Sie dazu das Aliases-Element im References-Element für jede Datei, um zwischen den beiden Dateien zu unterscheiden. Dieser Alias wird als Qualifizierer für den Komponentennamen verwendet und in einer der Dateien in die Komponente aufgelöst.
Hinweis
Verwenden Sie in Visual Studio den Befehl "Verweis hinzufügen ". Weitere Informationen finden Sie unter How to: Add or Remove References By Using the Reference Manager.
AddModules
Diese Option fügt ein Modul hinzu, das mit dem <OutputType>module</OutputType>
Switch zur aktuellen Kompilierung erstellt wurde:
<AddModule Include=file1 />
<AddModule Include=file2 />
Dabei file
handelt es sich um file2
Ausgabedateien, die Metadaten enthalten. Die Datei kann kein Assemblymanifest enthalten. Wenn Sie mehrere Dateien importieren möchten, trennen Sie Dateinamen entweder durch ein Komma oder ein Semikolon. Alle Module, die mit AddModules hinzugefügt wurden, müssen sich im selben Verzeichnis wie die Ausgabedatei zur Laufzeit befinden. Das heißt, Sie können ein Modul in einem beliebigen Verzeichnis zur Kompilierungszeit angeben, aber das Modul muss sich zur Laufzeit im Anwendungsverzeichnis befinden. Wenn sich das Modul zur Laufzeit nicht im Anwendungsverzeichnis befindet, erhalten Sie ein TypeLoadException.
file
kann keine Assembly enthalten. Wenn beispielsweise die Ausgabedatei mit der Option OutputType des Moduls erstellt wurde, können die Metadaten mit AddModules importiert werden.
Wenn die Ausgabedatei mit einer ausgabetyp-Option erstellt wurde, die kein Modul ist, können die Metadaten nicht mit AddModules importiert werden, können aber mit der Option "Verweise " importiert werden.
EmbedInteropTypes
Bewirkt, dass der Compiler COM-Typinformationen in den angegebenen Assemblys für das Projekt verfügbar macht, das Sie gerade kompilieren.
<References>
<EmbedInteropTypes>file1;file2;file3</EmbedInteropTypes>
</References>
Dabei file1;file2;file3
handelt es sich um eine durch Semikolons getrennte Liste von Assemblydateinamen. Wenn der Dateiname ein Leerzeichen enthält, schließen Sie den Namen in Anführungszeichen ein. Mit der Option "EmbedInteropTypes" können Sie eine Anwendung bereitstellen, die eingebettete Typinformationen enthält. Die Anwendung kann dann Typen in einer Laufzeitassembly verwenden, die die eingebetteten Typinformationen implementieren, ohne dass ein Verweis auf die Laufzeitassembly erforderlich ist. Wenn verschiedene Versionen der Laufzeitassembly veröffentlicht werden, kann die Anwendung, die die Eingebetteten Typinformationen enthält, mit den verschiedenen Versionen arbeiten, ohne neu kompiliert werden zu müssen. Ein Beispiel finden Sie unter Walkthrough: Embedding Types from Managed Assemblies.
Die Verwendung der Option EmbedInteropTypes ist besonders hilfreich, wenn Sie mit COM-Interoperabilität arbeiten. Sie können COM-Typen einbetten, damit Ihre Anwendung keine primäre Interopassembly (PIA) mehr auf dem Zielcomputer benötigt. Die Option EmbedInteropTypes weist den Compiler an, die COM-Typinformationen aus der referenzierten Interopassembly in den resultierenden kompilierten Code einzubetten. Der COM-Typ wird durch den CLSID (GUID)-Wert identifiziert. Daher kann Ihre Anwendung auf einem Zielcomputer ausgeführt werden, auf dem dieselben COM-Typen mit denselben CLSID-Werten installiert sind. Anwendungen, die Microsoft Office automatisieren, sind ein gutes Beispiel. Da Anwendungen wie Office in der Regel denselben CLSID-Wert in verschiedenen Versionen beibehalten, kann Ihre Anwendung die referenzierten COM-Typen verwenden, solange .NET Framework 4 oder höher auf dem Zielcomputer installiert ist und Ihre Anwendung Methoden, Eigenschaften oder Ereignisse verwendet, die in den referenzierten COM-Typen enthalten sind. Die Option EmbedInteropTypes bettet nur Schnittstellen, Strukturen und Delegaten ein. Das Einbetten von COM-Klassen wird nicht unterstützt.
Hinweis
Wenn Sie eine Instanz eines eingebetteten COM-Typs in Ihrem Code erstellen, müssen Sie die Instanz mithilfe der entsprechenden Schnittstelle erstellen. Wenn Sie versuchen, eine Instanz eines eingebetteten COM-Typs mithilfe der CoClass zu erstellen, tritt ein Fehler auf.
Wie bei der Compileroption "Verweise " verwendet die Compileroption "EmbedInteropTypes " die Antwortdatei "Csc.rsp", die auf häufig verwendete .NET-Assemblys verweist. Verwenden Sie die NoConfig-Compileroption , wenn Sie nicht möchten, dass der Compiler die Csc.rsp-Datei verwendet.
// The following code causes an error if ISampleInterface is an embedded interop type.
ISampleInterface<SampleType> sample;
Typen mit einem generischen Parameter, deren Typ aus einer Interopassembly eingebettet ist, können nicht verwendet werden, wenn dieser Typ von einer externen Assembly stammt. Diese Einschränkung gilt nicht für Schnittstellen. Betrachten Sie beispielsweise die Range Schnittstelle, die in der Microsoft.Office.Interop.Excel Assembly definiert ist. Wenn eine Bibliothek Interoptypen aus der Microsoft.Office.Interop.Excel Assembly einbettet und eine Methode verfügbar macht, die einen generischen Typ mit einem Parameter zurückgibt, dessen Typ die Range Schnittstelle ist, muss diese Methode eine generische Schnittstelle zurückgeben, wie im folgenden Codebeispiel gezeigt.
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;
}
}
Im folgenden Beispiel kann Clientcode die Methode aufrufen, die die IList generische Schnittstelle ohne Fehler zurückgibt.
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();
}
}