Packet Registry Generator
Trên trang này
PacketRegistryGenerator (analyzers/Nalix.Analyzers.Generators/PacketRegistryGenerator.cs) là một incremental Roslyn source generator, phát hiện mọi lớp gói tin cụ thể trong một compilation, kiểm tra giá trị StaticOpCode bị trùng (NALIX068), và sinh ra một [ModuleInitializer] đăng ký delegate Deserialize của từng gói tin với PacketRegistry.
Ánh xạ mã nguồn
analyzers/Nalix.Analyzers.Generators/PacketRegistryGenerator.csanalyzers/Nalix.Analyzers.Generators/Internal/GeneratorDiagnosticDescriptors.cssrc/Nalix.Codec/DataFrames/PacketRegistry.cs
Cách hoạt động
- Phát hiện gói tin:
- Quét compilation để tìm các lớp không abstract, implement
IPacketvàIPacketDeserializer<TSelf>(chẳng hạn các lớp con củaPacketBase<TSelf>), và có[Packet](AutoRegister != false) hoặc implementIPacketStaticOpcode.
- Quét compilation để tìm các lớp không abstract, implement
- Kiểm tra trùng opcode lúc biên dịch (
NALIX068):- Lấy giá trị
StaticOpCodecủa mọi lớp gói tin đã phát hiện trong compilation. Nếu hai lớp gói tin khai báo cùng mộtStaticOpCode, báo lỗiNALIX068.
- Lấy giá trị
- Đăng ký Module Initializer:
- Sinh ra
PacketRegistryGenerated.Initialize()([ModuleInitializer]) trongPacketRegistryGenerated.g.cs, gọiPacketRegistry.RegisterGenerated<TPacket>("Namespace.TPacket", static raw => TPacket.Deserialize(raw))cho mỗi kiểu gói tin đã phát hiện.
- Sinh ra
Cấu trúc mã được sinh ra
// <auto-generated/>
#nullable enable
using System.Runtime.CompilerServices;
using Nalix.Codec.DataFrames;
namespace Nalix.Generated
{
internal static class PacketRegistryGenerated
{
[ModuleInitializer]
internal static void Initialize()
{
PacketRegistry.RegisterGenerated<global::HelloWorld.Contracts.HelloRequestPacket>(
"HelloWorld.Contracts.HelloRequestPacket",
static raw => global::HelloWorld.Contracts.HelloRequestPacket.Deserialize(raw));
PacketRegistry.RegisterGenerated<global::HelloWorld.Contracts.HelloResponsePacket>(
"HelloWorld.Contracts.HelloResponsePacket",
static raw => global::HelloWorld.Contracts.HelloResponsePacket.Deserialize(raw));
}
}
}
Kích hoạt lúc chạy (PacketRegistry.Build())
[ModuleInitializer] lưu tạm các mục gói tin được sinh ra của mọi assembly khi module được nạp. Gọi PacketRegistry.Build() (được gọi tự động bởi NetworkApplicationBuilder.Build() và TransportSession, hoặc gọi thủ công trong các bài kiểm thử độc lập) sẽ biên dịch các đăng ký đã lưu tạm thành bảng tra cứu không khóa PacketDeserializer?[65536]:
using Nalix.Codec.DataFrames;
// Hoàn tất bảng tra cứu opcode O(1) gồm 65.536 mục
PacketRegistry.Build();
Chẩn đoán được phát ra
| ID | Tiêu đề | Mức độ | Nguyên nhân |
|---|---|---|---|
NALIX068 | StaticOpCode của gói tin bị trùng | Lỗi | Hai hoặc nhiều lớp gói tin trong compilation khai báo cùng một giá trị StaticOpCode. |