Not
Åtkomst till denna sida kräver auktorisation. Du kan prova att logga in eller byta katalog.
Åtkomst till denna sida kräver auktorisation. Du kan prova att byta katalog.
Före Orleans 7.0 var källgenereringen mer manuell och krävde uttryckliga åtgärder för utvecklare. Från och med Orleans 7.0 är kodgenereringen automatisk och kräver vanligtvis ingen åtgärd. Det finns dock fortfarande fall där det kan vara önskvärt att påverka kodgenereringen, till exempel att generera kod för typer som inte genereras automatiskt eller för typer i en annan sammansättning.
Aktivera kodgenerering
Orleans genererar C#-källkoden för appen vid byggtiden. Alla projekt, inklusive värdprojektet, behöver lämpliga NuGet-paket installerade, för att aktivera kodgenerering. Följande paket är tillgängliga:
- Alla klienter bör referera till Microsoft.Orleans. Klient.
- Alla silor (servrar) bör referera till Microsoft.Orleans. Server.
- Alla andra paket bör referera till Microsoft.Orleans. Sdk.
GenerateSerializerAttribute Använd för att ange att typen är avsedd för serialisering och som Orleans ska generera serialiseringskod för den. Mer information finns i Använda Orleans serialisering.
Exekveringstiden Orleans använder genererad kod för att säkerställa korrekt serialisering av typer som används i klustret och för att generera standardkod. Den här schablonen abstraherar bort implementeringsinformation om metodutsändning, undantagsvidarebefordran och andra interna körningskoncept. Kodgenerering kan utföras antingen när projekt skapas eller när programmet initieras.
Kodgenerering vid byggtid
Vid bygget Orleans genererar kod för alla typer som har markerats med GenerateSerializerAttribute. Om en typ inte är markerad med GenerateSerializerOrleans serialiserar den inte.
Om du utvecklar med F# eller Visual Basic kan kodgenerering också användas. Mer information finns i följande exempel:
Dessa exempel visar hur du använder Orleans.GenerateCodeForDeclaringAssemblyAttribute, specificera typer i assemblyn för att källgeneratorn ska inspektera och generera källkod.
Den föredragna metoden för kodgenerering är vid byggtiden. Aktivera generering av byggtidskod med något av följande paket:
-
Microsoft.Orleans.OrleansCodeGenerator.Build: Ett paket med Roslyn för kodgenerering och .NET Reflection för analys. -
Microsoft.Orleans.CodeGenerator.MSBuild: Ett nyare kodgenereringspaket som använder Roslyn för både kodgenerering och analys. Den läser inte in programbinärfiler och undviker problem som orsakas av motstridiga beroendeversioner och olika målramverk. Den här kodgeneratorn förbättrar också stödet för inkrementella versioner, vilket resulterar i kortare byggtider.
Installera ett av dessa paket i alla projekt som innehåller korn, korngränssnitt, anpassade serialiserare eller typer som skickas mellan korn. När du installerar ett paket matas ett mål in i projektet som genererar kod vid bygget.
Båda paketen (Microsoft.Orleans.CodeGenerator.MSBuild och Microsoft.Orleans.OrleansCodeGenerator.Build) stöder endast C#-projekt. Stöd för andra språk antingen med hjälp Microsoft.Orleans.OrleansCodeGenerator av paketet (beskrivs nedan) eller genom att skapa ett C#-projekt som fungerar som mål för kod som genereras från sammansättningar som skrivits på andra språk.
Generera ytterligare diagnostik vid byggtiden genom att ange ett värde för OrleansCodeGenLogLevel i målprojektets .csproj-fil . Till exempel: <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.
Kodgenerering vid initialiseringstid
I Orleans 7+ händer ingenting under initieringen. Kodgenerering sker endast vid byggtid.
Kodgenerering kan utföras under initieringen på klienten och silon genom att Microsoft.Orleans.OrleansCodeGenerator installera paketet och använda ApplicationPartManagerCodeGenExtensions.WithCodeGeneration tilläggsmetoden:
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration());
I föregående exempel builder kan vara en instans av antingen ISiloHostBuilder eller IClientBuilder. Skicka en valfri ILoggerFactory instans till WithCodeGeneration för att aktivera loggning under kodgenerering, till exempel:
ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration(codeGenLoggerFactory));
Påverka kodgenerering
När du tillämpar GenerateSerializerAttribute på en typ IdAttribute kan även användas för att unikt identifiera medlemmen. På samma sätt kan ett alias användas med hjälp av AliasAttribute. Mer information om hur du påverkar kodgenerering finns i Använda Orleans serialisering.
Under kodgenereringen kan genereringen av kod för en viss typ påverkas. Orleans genererar automatiskt kod för korngränssnitt, kornklasser, korntillstånd och typer som skickas som argument i kornmetoder. Om en typ inte passar dessa kriterier använder du följande metoder för att vägleda kodgenereringen ytterligare.
Om du lägger SerializableAttribute till en typ instrueras kodgeneratorn att generera en serialiserare för den.
Om du lägger [assembly: GenerateSerializer(Type)] till i ett projekt instrueras kodgeneratorn att behandla den typen som serialiserbar. Det orsakar ett fel om en serialiserare inte kan genereras för den typen (t.ex. eftersom typen inte är tillgänglig). Det här felet stoppar bygget om kodgenereringen är aktiverad. Det här attributet gör det också möjligt att generera kod för specifika typer från en annan sammansättning.
[assembly: KnownType(Type)] instruerar också kodgeneratorn att inkludera en viss typ (som kan komma från en refererad sammansättning), men det orsakar inget undantag om typen inte är tillgänglig.
Generera serialiserare för alla undertyper
Om du lägger KnownBaseTypeAttribute till i ett gränssnitt eller en klass instrueras kodgeneratorn att generera serialiseringskod för alla typer som ärver från eller implementerar den typen.
Generera kod för alla typer i en annan sammansättning
Ibland kan genererad kod inte inkluderas i en viss sammansättning vid byggtiden. Exempel är delade bibliotek som inte refererar Orleanstill , sammansättningar som skrivits på andra språk än C# och sammansättningar som källkoden inte är tillgänglig för. I dessa fall placerar du den genererade koden för dessa sammansättningar i en separat sammansättning som refereras till under initieringen.
Så här aktiverar du detta för en sammansättning:
- Skapa ett C#-projekt.
- Installera
Microsoft.Orleans.CodeGenerator.MSBuild-paketet ellerMicrosoft.Orleans.OrleansCodeGenerator.Build-paketet. - Lägg till en referens till målsammansättningen.
- Lägg till
[assembly: KnownAssembly("OtherAssembly")]på den översta nivån i en C#-fil.
KnownAssemblyAttribute Instruerar kodgeneratorn att inspektera den angivna sammansättningen och generera kod för typerna i den. Det här attributet kan användas flera gånger i ett projekt.
Lägg sedan till den genererade sammansättningen i klienten/silon under initieringen:
builder.ConfigureApplicationParts(
parts => parts.AddApplicationPart("CodeGenAssembly"));
I föregående exempel builder kan vara en instans av antingen ISiloHostBuilder eller IClientBuilder.
KnownAssemblyAttribute har en valfri egenskap, TreatTypesAsSerializable. Ange detta till true för att instruera kodgeneratorn att agera som om alla typer i sammansättningen har markerats som serialiserbara.