Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
До Orleans версии 7.0 генерация исходного кода была более ручной и требовала явного вмешательства разработчика. Начиная с Orleans версии 7.0 создание кода выполняется автоматически и обычно не требует вмешательства. Однако случаи по-прежнему существуют, когда может потребоваться влияние на создание кода, например для создания кода для типов, не созданных автоматически или для типов в другой сборке.
Включение создания кода
Orleans создает исходный код C# для приложения во время сборки. Всем проектам, включая хост, необходимо установить соответствующие пакеты NuGet для активации генерации кода. Доступны перечисленные далее пакеты:
- Все клиенты должны ссылаться на Microsoft.Orleans. Клиент.
- Все силосы (серверы) должны ссылаться на Microsoft.Orleans. Сервер.
- Все остальные пакеты должны ссылаться на Microsoft.Orleans. Пакет SDK.
GenerateSerializerAttribute Используйте этот параметр, чтобы указать, что тип предназначен для сериализации и который Orleans должен создать для него код сериализации. Дополнительные сведения см. в разделе "Использование Orleans сериализации".
Среда Orleans выполнения использует созданный код для обеспечения правильной сериализации типов, используемых в кластере, и для создания стандартного кода. Этот шаблон скрывает сведения о реализации диспетчеризации методов, распространении исключений и других внутренних понятий выполнения программы. Создание кода можно выполнять либо при создании проектов, либо при инициализации приложения.
Создание кода во время сборки
Во время сборки создается код для всех типов, Orleans помеченных как GenerateSerializerAttribute. Если тип не помечен как GenerateSerializerAttribute, Orleans не сериализует его.
При разработке с помощью F# или Visual Basic также можно использовать создание кода. Дополнительные сведения см. в следующих примерах:
В этих примерах демонстрируется использование Orleans.GenerateCodeForDeclaringAssemblyAttribute, а также указание типов в сборке, которые исходный генератор должен проверить и создать на их основе исходный код.
Предпочтительный метод для создания кода - на этапе сборки. Включите создание кода во время сборки с помощью одного из следующих пакетов:
-
Microsoft.Orleans.OrleansCodeGenerator.Build: пакет, использующий Roslyn для создания кода и .NET-рефлексии для анализа. -
Microsoft.Orleans.CodeGenerator.MSBuild: новый пакет создания кода, используя Roslyn как для создания кода, так и для анализа. Он не загружает двоичные файлы приложений, избегая проблем, вызванных столкновением версий зависимостей и разными целевыми платформами. Этот генератор кода также улучшает поддержку добавочных сборок, что приводит к более короткому времени сборки.
Установите один из этих пакетов в проекты, которые содержат зерна, их интерфейсы, пользовательские сериализаторы или типы, которые передаются между зернами. Установка пакета внедряет целевой объект в проект, который создает код во время сборки.
Оба пакета (Microsoft.Orleans.CodeGenerator.MSBuild и Microsoft.Orleans.OrleansCodeGenerator.Build) поддерживают только проекты C#. Поддержка других языков либо с помощью Microsoft.Orleans.OrleansCodeGenerator пакета (описанного ниже), либо путем создания проекта C# в качестве целевого объекта для кода, созданного из сборок, написанных на других языках.
Выведите дополнительную диагностику во время сборки, указав значение в OrleansCodeGenLogLevelCSPROJ-файле целевого проекта. Например: <OrleansCodeGenLogLevel>Trace</OrleansCodeGenLogLevel>.
Создание кода во время инициализации
В Orleans 7+, во время инициализации ничего не происходит. Создание кода происходит только во время сборки.
Создание кода можно выполнить во время инициализации клиента и silo, установив Microsoft.Orleans.OrleansCodeGenerator пакет и используя ApplicationPartManagerCodeGenExtensions.WithCodeGeneration метод расширения:
public static void ConfigureWithCodeGeneration(ISiloHostBuilder builder)
{
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration());
}
В предыдущем примере builder может быть экземпляром либо ISiloHostBuilder, либо IClientBuilder. Передайте необязательный экземпляр ILoggerFactory в WithCodeGeneration, чтобы включить ведение журнала во время создания кода, например:
public static void ConfigureWithCodeGenerationLogging(ISiloHostBuilder builder)
{
ILoggerFactory codeGenLoggerFactory = new LoggerFactory();
codeGenLoggerFactory.AddProvider(new ConsoleLoggerProvider());
builder.ConfigureApplicationParts(
parts => parts
.AddApplicationPart(typeof(IRuntimeCodeGenGrain).Assembly)
.WithCodeGeneration(codeGenLoggerFactory));
}
Влияние создания кода
При применении GenerateSerializerAttribute к типу можно также применить IdAttribute для уникального определения члена. Аналогичным образом, псевдоним можно применить, используя AliasAttribute. Дополнительные сведения о влиянии на создание кода см. в разделе "Использование Orleans сериализации".
Во время генерации кода на процесс создания кода для определенного типа может повлиять. Orleans автоматически создает код для интерфейсов зерна, классов зерна, состояния зерна и типов, передаваемых в качестве аргументов в методах зерна. Если тип не соответствует этим критериям, используйте следующие методы для дальнейшего создания кода.
Добавление SerializableAttribute к типу указывает генератору кода создать сериализатор для него.
Добавление [assembly: GenerateSerializer(Type)] в проект указывает генератору кода рассматривать этот тип как сериализуемый. Это приводит к ошибке, если сериализатор не может быть создан для этого типа (например, так как тип недоступен). Эта ошибка останавливает сборку, если включено создание кода. Этот атрибут также позволяет создавать код для определенных типов из другой сборки.
[assembly: KnownType(Type)] также указывает генератору кода включить определенный тип (который может быть из указанной сборки), но не вызывает исключение, если тип недоступен.
Создание сериализаторов для всех подтипов
Добавление KnownBaseTypeAttribute в интерфейс или класс указывает генератору кода создавать код сериализации для всех типов, наследуемых от этого типа или реализующих его.
Создание кода для всех типов в другой сборке
Иногда созданный код нельзя включить в определенную сборку во время сборки. Примеры включают общие библиотеки, не ссылающиеся на Orleans, сборки, написанные на языках, отличных от C#, и сборки, для которых исходный код недоступен. В этих случаях поместите созданный код для этих сборок в отдельную сборку, на которую ссылаются во время инициализации.
Чтобы включить эту функцию для сборки, выполните указанные ниже действия.
- Создайте проект C#.
- Установите пакет
Microsoft.Orleans.CodeGenerator.MSBuildилиMicrosoft.Orleans.OrleansCodeGenerator.Build. - Добавьте ссылку на целевую сборку.
- Добавьте
[assembly: KnownAssembly("OtherAssembly")]на верхнем уровне файла C#.
Генератор KnownAssemblyAttribute кода указывает генератору кода проверить указанную сборку и создать код для типов в нем. Этот атрибут можно использовать несколько раз в проекте.
Затем добавьте созданную сборку в клиент/silo во время инициализации:
public static void ConfigureWithExternalAssembly(ISiloHostBuilder builder)
{
var assembly = Assembly.Load("CodeGenAssembly");
builder.ConfigureApplicationParts(
parts => parts.AddApplicationPart(assembly));
}
В предыдущем примере builder может быть экземпляром либо ISiloHostBuilder, либо IClientBuilder.
KnownAssemblyAttributeимеет необязательное свойство. TreatTypesAsSerializable Установите это значение на true, чтобы генератор кода считал, что все типы в этой сборке помечены как сериализуемые.