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.
Vor Orleans 7.0 war die Quellgenerierung manueller und erforderte explizite Entwicklereingriffe. Orleans Ab 7.0 wird die Codegenerierung automatisch und erfordert in der Regel keinen Eingriff. Es gibt jedoch weiterhin Fälle, in denen die Beeinflussung von Code gewünscht werden kann, z. B. zum Generieren von Code für Typen, die nicht automatisch generiert werden, oder für Typen in einer anderen Assembly.
Aktivieren der Codegenerierung
Orleans generiert C#-Quellcode für die App während der Erstellung. Alle Projekte, einschließlich des Hosts, benötigen die entsprechenden NuGet-Pakete installiert, um die Codegenerierung zu ermöglichen. Folgende Pakete sind verfügbar:
- Alle Clients müssen auf Microsoft.Orleans.Client verweisen.
- Alle Silos (Server) müssen auf Microsoft.Orleans.Server verweisen.
- Alle anderen Pakete müssen auf Microsoft.Orleans.Sdk verweisen.
Verwenden Sie GenerateSerializerAttribute, um anzugeben, dass der Typ für die Serialisierung vorgesehen ist und dass Orleans dafür den Serialisierungscode generieren soll. Weitere Informationen finden Sie unter Verwenden der Orleans-Serialisierung.
Die Orleans Laufzeit verwendet generierten Code, um die ordnungsgemäße Serialisierung von Typen sicherzustellen, die im gesamten Cluster verwendet werden, und um Codebausteine zu generieren. Dieses Boilerplate abstrahiert die Implementierungsdetails der Methodenaufrufe, der Ausnahmenerfassung und anderer interner Laufzeitkonzepte. Die Codegenerierung kann entweder beim Erstellen von Projekten oder beim Initialisieren der Anwendung ausgeführt werden.
Erstellungszeitcodegenerierung
Zur Erstellungszeit generiert Orleans Code für alle Typen, die mit GenerateSerializerAttribute markiert sind. Wenn ein Typ nicht mit GenerateSerializer markiert ist, wird er nicht von Orleans serialisiert.
Bei der Entwicklung mit F# oder Visual Basic kann auch die Codegenerierung verwendet werden. Weitere Informationen finden Sie in den folgenden Beispielen:
Diese Beispiele veranschaulichen die Verwendung der Orleans.GenerateCodeForDeclaringAssemblyAttribute und das Spezifizieren von Typen in der Assembly, damit der Quellgenerator den Quellcode prüfen und generieren kann.
Die bevorzugte Methode für die Codegenerierung ist während der Erstellung des Builds. Aktivieren Sie die Erstellungszeitcodegenerierung mithilfe eines der folgenden Pakete:
-
Microsoft.Orleans.OrleansCodeGenerator.Build: Ein Paket, das Roslyn für die Codegenerierung und .NET Reflection für die Analyse verwendet. -
Microsoft.Orleans.CodeGenerator.MSBuild: Ein neueres Codegenerierungspaket, das Roslyn sowohl für die Codegenerierung als auch für die Analyse nutzt. Es werden keine Anwendungsbinärdateien geladen, wodurch Probleme vermieden werden, die durch Konflikte zwischen Abhängigkeitsversionen und unterschiedlichen Zielframeworks verursacht werden. Dieser Codegenerator verbessert auch die Unterstützung für inkrementelle Builds, was zu kürzeren Buildzeiten führt.
Installieren Sie eines dieser Pakete in allen Projekten, die Körner, Körnerschnittstellen, benutzerdefinierte Serialisierer oder Typen enthalten, die zwischen Körnern gesendet werden. Durch die Installation eines Pakets wird ein Ziel in das Projekt eingefügt, das zur Erstellungszeit Code generiert.
Beide Pakete (Microsoft.Orleans.CodeGenerator.MSBuild und Microsoft.Orleans.OrleansCodeGenerator.Build) werden nur in C#-Projekten unterstützt. Unterstützen Sie andere Sprachen entweder mithilfe des Microsoft.Orleans.OrleansCodeGenerator Pakets (siehe unten) oder durch Erstellen eines C#-Projekts als Ziel für Code, der aus Assemblys generiert wird, die in anderen Sprachen geschrieben wurden.
Geben Sie zur Zeit der Erstellung zusätzliche Diagnosen aus, indem Sie einen Wert für OrleansCodeGenLogLevel in der .csproj-Datei des Zielprojekts angeben. Beispiel: <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.
Initialisierungszeitcodegenerierung
In Orleans 7 und höher passiert während der Initialisierung gar nichts. Die Codegenerierung erfolgt nur zur Build-Zeit.
Die Codegenerierung kann während der Initialisierung auf dem Client und im Silo erfolgen, indem Sie das Paket Microsoft.Orleans.OrleansCodeGenerator installieren und die Erweiterungsmethode ApplicationPartManagerCodeGenExtensions.WithCodeGeneration verwenden:
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration());
Im vorherigen Beispiel kann builder entweder eine Instanz von ISiloHostBuilder oder IClientBuilder sein. Übergeben Sie eine optionale ILoggerFactory-Instanz an WithCodeGeneration, um die Protokollierung während der Codegenerierung zu aktivieren, z. B.:
ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration(codeGenLoggerFactory));
Beeinflussen der Codegenerierung
Durch die Anwendung von GenerateSerializerAttribute auf einen Typ kann auch IdAttribute angewendet werden, um das Mitglied eindeutig zu identifizieren. Ebenso kann ein Alias mithilfe der AliasAttribute eingesetzt werden. Weitere Informationen zum Beeinflussen der Codegenerierung finden Sie unter Verwenden der Orleans-Serialisierung.
Während der Codegenerierung kann die Generierung von Code für einen bestimmten Typ beeinflusst werden. Orleans generiert automatisch Code für Kornschnittstellen, Kornklassen, Kornzustand und Typen, die als Argumente in Getreidemethoden übergeben werden. Wenn ein Typ diese Kriterien nicht erfüllt, verwenden Sie die folgenden Methoden, um die Codegenerierung weiter zu leiten.
Durch Das Hinzufügen SerializableAttribute zu einem Typ wird der Codegenerator angewiesen, einen Serialisierer dafür zu generieren.
Durch das Hinzufügen [assembly: GenerateSerializer(Type)] zu einem Projekt wird der Codegenerator angewiesen, diesen Typ als serialisierbar zu behandeln. Es verursacht einen Fehler, wenn ein Serialisierer für diesen Typ nicht generiert werden kann (z. B. weil auf den Typ nicht zugegriffen werden kann). Dieser Fehler hält den Build an, wenn die Codegenerierung aktiviert ist. Dieses Attribut ermöglicht auch das Generieren von Code für bestimmte Typen aus einer anderen Assembly.
[assembly: KnownType(Type)] weist den Codegenerator außerdem an, einen bestimmten Typ (der von einer referenzierten Assembly stammen kann) einzuschließen, verursacht jedoch keine Ausnahme, wenn auf den Typ nicht zugegriffen werden kann.
Generieren von Serialisierungsmodulen für alle Untertypen
Durch Das Hinzufügen KnownBaseTypeAttribute zu einer Schnittstelle oder Klasse wird der Codegenerator angewiesen, Serialisierungscode für alle Typen zu generieren, die von diesem Typ erben oder implementieren.
Generieren von Code für alle Typen in einer anderen Assembly
Manchmal kann generierter Code nicht zur Erstellungszeit in eine bestimmte Assembly eingeschlossen werden. Beispiele sind freigegebene Bibliotheken, die nicht auf Orleans verweisen, Assemblys, die in anderen Sprachen als C# geschrieben wurden, und Assemblys, für die der Quellcode nicht verfügbar ist. Platzieren Sie in diesen Fällen den generierten Code für diese Assemblys in eine separate Assembly, auf die während der Initialisierung verwiesen wird.
So aktivieren Sie dies für eine Assembly
- Erstellen Sie ein C#-Projekt.
- Installieren Sie das
Microsoft.Orleans.CodeGenerator.MSBuild-Paket oder dasMicrosoft.Orleans.OrleansCodeGenerator.Build-Paket. - Fügen Sie einen Verweis auf die Zielassembly hinzu.
- Fügen Sie auf der obersten Ebene einer C#-Datei
[assembly: KnownAssembly("OtherAssembly")]hinzu.
KnownAssemblyAttribute weist den Codegenerator an, die angegebene Assembly zu überprüfen und Code für die darin enthaltenen Typen zu generieren. Dieses Attribut kann mehrmals innerhalb eines Projekts verwendet werden.
Fügen Sie dann die generierte Assembly während der Initialisierung dem Client/Silo hinzu:
builder.ConfigureApplicationParts(
parts => parts.AddApplicationPart("CodeGenAssembly"));
Im vorherigen Beispiel kann builder entweder eine Instanz von ISiloHostBuilder oder IClientBuilder sein.
KnownAssemblyAttribute verfügt über eine optionale Eigenschaft, TreatTypesAsSerializable. Stellen Sie dies auf true ein, um den Codegenerator anzuweisen, so zu handeln, als ob alle Typen in dieser Assembly als serialisierbar gekennzeichnet sind.