Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Przed Orleans 7.0 generowanie źródła było bardziej ręczne i wymagało jawnej interwencji dewelopera. Orleans Począwszy od wersji 7.0, generowanie kodu jest automatyczne i zwykle nie wymaga interwencji. Jednak nadal istnieją przypadki, w których może być pożądane wywieranie wpływu na generowanie kodu, na przykład generowanie kodu dla typów, które nie są generowane automatycznie lub dla typów w innym zestawie.
Włączanie generowania kodu
Orleans Generuje kod źródłowy języka C# dla aplikacji w czasie kompilacji. Wszystkie projekty, w tym host, wymagają zainstalowania odpowiednich pakietów NuGet w celu włączenia generowania kodu. Dostępne są następujące pakiety:
- Wszyscy klienci powinni odwoływać się do firmy Microsoft.Orleans. Klient.
- Wszystkie silosy (serwery) powinny odwoływać się do firmy Microsoft.Orleans Serwer.
- Wszystkie inne pakiety powinny odwoływać się do microsoft.Orleans. Zestaw SDK.
Użyj GenerateSerializerAttribute aby określić, że typ jest przeznaczony do serializacji i że Orleans powinien wygenerować kod serializacji dla niego. Aby uzyskać więcej informacji, zobacz Używanie Orleans serializacji.
Środowisko Orleans uruchomieniowe używa wygenerowanego kodu, aby zapewnić prawidłową serializację typów używanych w klastrze i generować kod szablonowy. Ten kod szablonowy oddziela szczegóły implementacji wywoływania metod, propagacji wyjątków i innych wewnętrznych pojęć dotyczących środowiska wykonawczego. Generowanie kodu można wykonać podczas kompilowania projektów lub inicjowania aplikacji.
Generowanie kodu w czasie kompilacji
Podczas budowania Orleans generuje kod dla wszystkich typów oznaczonych GenerateSerializerAttribute. Jeśli typ nie jest oznaczony znakiem GenerateSerializer
, Orleans nie będzie serializować go.
W przypadku programowania za pomocą języka F# lub Visual Basic można również użyć generowania kodu. Aby uzyskać więcej informacji, zobacz następujące przykłady:
W tych przykładach pokazano użycie elementu Orleans.GenerateCodeForDeclaringAssemblyAttribute, określając typy w zestawie dla generatora źródłowego w celu sprawdzenia i wygenerowania kodu źródłowego.
Preferowaną metodą generowania kodu jest w czasie kompilacji. Włącz generowanie kodu w czasie kompilacji przy użyciu jednego z następujących pakietów:
-
Microsoft.Orleans.OrleansCodeGenerator.Build
: Pakiet używający narzędzia Roslyn do generowania kodu oraz odbicia .NET do analizy. -
Microsoft.Orleans.CodeGenerator.MSBuild
: nowszy pakiet generowania kodu korzystający z narzędzia Roslyn zarówno do generowania kodu, jak i analizy. Nie ładuje plików binarnych aplikacji, unikając problemów spowodowanych starciem wersji zależności i różnymi platformami docelowymi. Ten generator kodu zwiększa również obsługę kompilacji przyrostowych, co pozwala skrócić czas kompilacji.
Zainstaluj jeden z tych pakietów we wszystkich projektach zawierających ziarna, interfejsy ziarna, niestandardowe serializatory lub typy wysyłane między ziarnami. Zainstalowanie pakietu powoduje wstrzyknięcie elementu docelowego do projektu, który generuje kod w czasie kompilacji.
Oba pakiety (Microsoft.Orleans.CodeGenerator.MSBuild
i Microsoft.Orleans.OrleansCodeGenerator.Build
) obsługują tylko projekty języka C#. Obsługuj inne języki, używając pakietu Microsoft.Orleans.OrleansCodeGenerator
(opisanego poniżej) lub tworząc projekt C#, który działa jako cel dla kodu generowanego z zestawów napisanych w innych językach.
Aby emitować dodatkową diagnostykę w czasie kompilacji, określ wartość dla OrleansCodeGenLogLevel
w pliku .csproj projektu docelowego. Na przykład: <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>
.
Generowanie kodu podczas inicjalizacji
W Orleans wersji 7+ podczas inicjowania nic się nie dzieje. Generowanie kodu odbywa się tylko w czasie kompilacji.
Generowanie kodu można wykonać podczas inicjowania na kliencie i silosie, instalując Microsoft.Orleans.OrleansCodeGenerator
pakiet i używając ApplicationPartManagerCodeGenExtensions.WithCodeGeneration metody rozszerzenia:
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration());
W poprzednim przykładzie builder
może być wystąpieniem ISiloHostBuilder lub IClientBuilder. Aby włączyć rejestrowanie podczas generowania kodu, przekaż opcjonalne wystąpienie ILoggerFactory do WithCodeGeneration
, na przykład:
ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration(codeGenLoggerFactory));
Wpływ na generowanie kodu
Stosując GenerateSerializerAttribute do typu, można również zastosować IdAttribute, aby unikatowo zidentyfikować członka. Podobnie alias można zastosować przy użyciu elementu AliasAttribute. Aby uzyskać więcej informacji na temat wpływu na generowanie kodu, zobacz Używanie Orleans serializacji.
Podczas generowania kodu proces tworzenia kodu dla konkretnego typu może być zmieniany. Orleans automatycznie generuje kod dla interfejsów ziarna, klas ziarna, stanu ziarna i typów przekazywanych jako argumenty w metodach ziarna. Jeśli typ nie pasuje do tych kryteriów, użyj następujących metod, aby kontynuować generowanie kodu.
Dodanie SerializableAttribute do typu powoduje, że generator kodu wygeneruje dla niego serializator.
Dodanie [assembly: GenerateSerializer(Type)]
do projektu powoduje, że generator kodu traktuje ten typ jako możliwy do serializacji. Powoduje to błąd, jeśli nie można wygenerować serializatora dla tego typu (np., ponieważ typ nie jest dostępny). Ten błąd zatrzymuje kompilację, jeśli generowanie kodu jest włączone. Ten atrybut umożliwia również generowanie kodu dla określonych typów z innego zestawu.
[assembly: KnownType(Type)]
Instruuje również generator kodu, aby zawierał określony typ (który może pochodzić z zestawu, do którego odwołuje się odwołanie), ale nie powoduje wyjątku, jeśli typ jest niedostępny.
Generowanie serializatorów dla wszystkich podtypów
Dodanie KnownBaseTypeAttribute do interfejsu lub klasy instruuje generator kodu do wygenerowania kodu serializacji dla wszystkich typów dziedziczących z tego typu lub implementujących ten typ.
Generowanie kodu dla wszystkich typów w innym zestawie
Czasami wygenerowany kod nie może być uwzględniony w określonym zestawie w czasie kompilacji. Przykłady obejmują biblioteki współdzielone, które nie odwołują się do Orleans, zestawy napisane w językach innych niż C#, oraz zestawy, dla których kod źródłowy nie jest dostępny. W takich przypadkach umieść wygenerowany kod dla tych zestawów w oddzielnym zestawie, do których odwołuje się podczas inicjowania.
Aby włączyć to dla zestawu:
- Utwórz projekt w języku C#.
- Zainstaluj pakiet
Microsoft.Orleans.CodeGenerator.MSBuild
lubMicrosoft.Orleans.OrleansCodeGenerator.Build
. - Dodaj odwołanie do zestawu docelowego.
- Dodaj
[assembly: KnownAssembly("OtherAssembly")]
na najwyższym poziomie pliku C#.
Polecenie KnownAssemblyAttribute instruuje generator kodu, aby sprawdzić określony zestaw i wygenerować kod dla typów w nim. Ten atrybut może być używany wiele razy w projekcie.
Następnie dodaj wygenerowany zestaw do klienta/silosu podczas inicjowania:
builder.ConfigureApplicationParts(
parts => parts.AddApplicationPart("CodeGenAssembly"));
W poprzednim przykładzie builder
może być wystąpieniem ISiloHostBuilder lub IClientBuilder.
KnownAssemblyAttribute
ma opcjonalną właściwość . TreatTypesAsSerializable Ustaw to na true
, aby poinstruować generator kodu, by działał, jakby wszystkie typy w tym zestawieniu były oznaczone jako serializowalne.