Delen via


C#-compileropties waarmee invoer wordt opgegeven

Met de volgende opties kunt u invoer van compileren beheren. De nieuwe MSBuild-syntaxis wordt vet weergegeven. De oudere csc.exe syntaxis wordt weergegeven in code style.

  • Verwijzingen / -reference of -references: naslagmetagegevens uit het opgegeven assemblybestand of de opgegeven assemblybestanden.
  • AddModules-addmodule / : Voeg een module toe (gemaakt met target:module deze assembly.)
  • EmbedInteropTypes / -link: Insluit metagegevens uit de opgegeven interop-assemblybestanden.

Verwijzingen

De optie Verwijzingen zorgt ervoor dat de compiler informatie over het openbare type in het opgegeven bestand in het huidige project importeert, zodat u kunt verwijzen naar metagegevens uit de opgegeven assemblybestanden.

<Reference Include="filename" />

filename is de naam van een bestand dat een assemblymanifest bevat. Als u meer dan één bestand wilt importeren, moet u een afzonderlijk verwijzingselement voor elk bestand opnemen. U kunt een alias definiëren als een onderliggend element van het verwijzingselement :

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

In het vorige voorbeeld LS is de geldige C#-id die een hoofdnaamruimte vertegenwoordigt die alle naamruimten in de assembly-filename.dll bevat. De bestanden die u importeert, moeten een manifest bevatten. Gebruik AdditionalLibPaths om de map op te geven waarin een of meer assemblyverwijzingen zich bevinden. In het onderwerp AdditionalLibPaths worden ook de mappen besproken waarin de compiler zoekt naar assembly's. Als de compiler een type in een assembly kan herkennen en niet in een module, moet het worden gedwongen om het type op te lossen, wat u kunt doen door een exemplaar van het type te definiëren. Er zijn andere manieren om typenamen in een assembly voor de compiler op te lossen: als u bijvoorbeeld overneemt van een type in een assembly, wordt de typenaam vervolgens herkend door de compiler. Soms is het noodzakelijk om te verwijzen naar twee verschillende versies van hetzelfde onderdeel vanuit één assembly. Gebruik hiervoor het element Aliassen in het element Verwijzingen voor elk bestand om onderscheid te maken tussen de twee bestanden. Deze alias wordt gebruikt als kwalificatie voor de onderdeelnaam en wordt omgezet in het onderdeel in een van de bestanden.

Notitie

Gebruik in Visual Studio de opdracht Verwijzing toevoegen. Zie Instructies voor meer informatie : Verwijzingen toevoegen of verwijderen met behulp van Reference Manager.

AddModules

Met deze optie wordt een module toegevoegd die is gemaakt met de <TargetType>module</TargetType> schakeloptie naar de huidige compilatie:

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

Waar file, file2 zijn uitvoerbestanden die metagegevens bevatten. Het bestand kan geen assemblymanifest bevatten. Als u meer dan één bestand wilt importeren, scheidt u bestandsnamen met een komma of een puntkomma. Alle modules die zijn toegevoegd met AddModules , moeten zich in dezelfde map bevinden als het uitvoerbestand tijdens runtime. Dat wil gezegd, u kunt een module opgeven in elke map tijdens het compileren, maar de module moet zich in de toepassingsmap bevinden tijdens runtime. Als de module zich tijdens runtime niet in de toepassingsmap bevindt, krijgt u een TypeLoadException. file mag geen assembly bevatten. Als het uitvoerbestand bijvoorbeeld is gemaakt met de optie TargetType van de module, kunnen de metagegevens worden geïmporteerd met AddModules.

Als het uitvoerbestand is gemaakt met een andere TargetType-optie dan module, kunnen de metagegevens niet worden geïmporteerd met AddModules, maar kunnen ze worden geïmporteerd met de optie Verwijzingen.

EmbedInteropTypes

Zorgt ervoor dat de compiler COM-typegegevens in de opgegeven assembly's beschikbaar maakt voor het project dat u momenteel samenvoegt.

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

Waar file1;file2;file3 bevindt zich een door puntkomma's gescheiden lijst met assemblybestandsnamen. Als de bestandsnaam een spatie bevat, plaatst u de naam tussen aanhalingstekens. Met de optie EmbedInteropTypes kunt u een toepassing met ingesloten typegegevens implementeren. De toepassing kan vervolgens typen gebruiken in een runtime-assembly die de informatie over het ingesloten type implementeert zonder dat er een verwijzing naar de runtime-assembly nodig is. Als verschillende versies van de runtime-assembly worden gepubliceerd, kan de toepassing die de informatie over het ingesloten type bevat, met de verschillende versies werken zonder dat deze opnieuw hoeft te worden gecompileerd. Zie Walkthrough voor een voorbeeld: Typen insluiten vanuit beheerde assembly's.

Het gebruik van de optie EmbedInteropTypes is vooral handig wanneer u met COM-interop werkt. U kunt COM-typen insluiten, zodat uw toepassing geen primaire assembly voor interopassembly meer nodig heeft op de doelcomputer. Met de optie EmbedInteropTypes wordt de compiler geïnstrueerd om de COM-typegegevens van de interop-assembly waarnaar wordt verwezen, in te sluiten in de resulterende gecompileerde code. Het COM-type wordt geïdentificeerd door de GUID-waarde (CLSID). Als gevolg hiervan kan uw toepassing worden uitgevoerd op een doelcomputer waarop dezelfde COM-typen met dezelfde CLSID-waarden zijn geïnstalleerd. Toepassingen die Microsoft Office automatiseren, zijn een goed voorbeeld. Omdat toepassingen zoals Office meestal dezelfde CLSID-waarde in verschillende versies behouden, kan uw toepassing de COM-typen waarnaar wordt verwezen, gebruiken zolang .NET Framework 4 of hoger is geïnstalleerd op de doelcomputer en uw toepassing methoden, eigenschappen of gebeurtenissen gebruikt die zijn opgenomen in de com-typen waarnaar wordt verwezen. Met de optie EmbedInteropTypes worden alleen interfaces, structuren en gemachtigden ingesloten. Het insluiten van COM-klassen wordt niet ondersteund.

Notitie

Wanneer u een exemplaar van een ingesloten COM-type in uw code maakt, moet u het exemplaar maken met behulp van de juiste interface. Een poging om een exemplaar van een ingesloten COM-type te maken met behulp van de CoClass veroorzaakt een fout.

Net als de optie Verwijzingen compiler maakt de compileroptie EmbedInteropTypes gebruik van het Csc.rsp-antwoordbestand, dat verwijst naar veelgebruikte .NET-assembly's. Gebruik de optie NoConfig-compiler als u niet wilt dat de compiler het Csc.rsp-bestand gebruikt.

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

Typen met een algemene parameter waarvan het type is ingesloten vanuit een interoperabiliteitsassembly, kunnen niet worden gebruikt als dat type afkomstig is van een externe assembly. Deze beperking is niet van toepassing op interfaces. Denk bijvoorbeeld aan de Range interface die is gedefinieerd in de Microsoft.Office.Interop.Excel assembly. Als een bibliotheek interoptypen uit de Microsoft.Office.Interop.Excel assembly insluit en een methode beschikbaar maakt die een algemeen type retourneert met een parameter waarvan het type de Range interface is, moet die methode een algemene interface retourneren, zoals wordt weergegeven in het volgende codevoorbeeld.

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

In het volgende voorbeeld kan clientcode de methode aanroepen die de IList algemene interface zonder fouten retourneert.

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