Tài liệu

Bộ sinh mã nguồn

Thời gian đọc 3 phút Gói: Nalix.Analyzers
Trên trang này

Nalix.Analyzers.Generators chứa 7 bộ sinh mã nguồn Roslyn incremental (IIncrementalGenerator), được đóng gói bên trong Nalix.Abstractions. Bằng cách chuyển việc biên dịch handler, dependency injection, đo kích thước gói tin, tuần tự hóa nhị phân và stub client RPC sang thời điểm biên dịch, Nalix đạt được việc không dùng reflection lúc chạy và tương thích đầy đủ với NativeAOT / IL2CPP.

Ánh xạ mã nguồn

  • analyzers/Nalix.Analyzers.Generators/PacketHandlerGenerator.cs
  • analyzers/Nalix.Analyzers.Generators/InstanceGenerator.cs
  • analyzers/Nalix.Analyzers.Generators/SerializeFormatterGenerator.cs
  • analyzers/Nalix.Analyzers.Generators/PacketRegistryGenerator.cs
  • analyzers/Nalix.Analyzers.Generators/PacketSchemaGenerator.cs
  • analyzers/Nalix.Analyzers.Generators/ConfigurationGenerator.cs
  • analyzers/Nalix.Analyzers.Generators/RpcClientGenerator.cs
  • analyzers/Nalix.Analyzers.Generators/Internal/GeneratorDiagnosticDescriptors.cs

7 bộ sinh mã nguồn

Bộ sinhĐiều kiện kích hoạtĐầu ra được sinhChẩn đoán
Bộ sinh Packet Handler (PacketHandlerGenerator)Lớp [PacketHandler] có các method [PacketOpcode]Triển khai IPacketHandlerCompiler + <Controller>_Inject.g.cs (InitializeDependencies()) + [ModuleInitializer] đăng ký với PacketHandlerRegistryNALIX067
Bộ sinh Instance (InstanceGenerator)Lớp [Injectable] hoặc lớp con của SingletonBase<T>InstanceGenerated.Initialize() ([ModuleInitializer]) gọi InstanceManager.RegisterActivator, RegisterServiceMapping và SingletonActivatorCache.RegisterNALIX063, NALIX064, NALIX065
Bộ sinh tuần tự hóa (SerializeFormatterGenerator)Lớp hoặc struct có [GenerateFormatter]Triển khai IFormatter<T> + IFillableFormatter<T> + [ModuleInitializer] đăng ký với FormatterProviderNALIX059
Bộ sinh Packet Registry (PacketRegistryGenerator)Lớp IPacket cụ thể có IPacketDeserializer<TSelf> và [Packet] hoặc IPacketStaticOpcodePacketRegistryGenerated.Initialize() ([ModuleInitializer]) gọi PacketRegistry.RegisterGenerated<TPacket>NALIX068
Bộ sinh Packet Schema (PacketSchemaGenerator)Lớp partial kế thừa PacketBase<TSelf>Override Length, override ResetForPool() và static int Size (khi triển khai IFixedSizeSerializable)NALIX060
Bộ sinh cấu hình (ConfigurationGenerator)Lớp partial kế thừa ConfigurationLoaderOverride CopyPropertiesTo, BindProperties và ValidateDataAnnotations—
Bộ sinh RPC Client (RpcClientGenerator)Interface được chú thích [RpcService]internal sealed class <Service>_RpcClient : <IService> đăng ký qua RpcExtensions.RegisterFactoryNALIX066

Bộ sinh RPC Client (RpcClientGenerator)

RpcClientGenerator (analyzers/Nalix.Analyzers.Generators/RpcClientGenerator.cs) sinh một lớp proxy client cụ thể (internal sealed class <Service>_RpcClient : <IService>) cho mỗi interface được đánh dấu [RpcService] (Nalix.Abstractions.Networking.Rpc), và đăng ký nó trong một [ModuleInitializer] (<Service>_RpcClientInitializer.Initialize()) qua RpcExtensions.RegisterFactory(typeof(IService), session => new <Service>_RpcClient(session)).

Kiểu trả về được hỗ trợ

Mỗi method [PacketOpcode(opCode)] trong interface [RpcService] được ánh xạ dựa trên kiểu trả về của nó:

Kiểu trả về của method interfaceLệnh ITransportSession được sinhHành vi
ValueTasknew ValueTask(_session.SendAsync(request, encrypt, ct))Gửi gói một chiều, không chờ phản hồi (ValueTask).
Task_session.SendAsync(request, encrypt, ct)Gửi gói một chiều, không chờ phản hồi (Task).
ValueTask<TResponse>_session.RequestAsync<TResponse>(request, options, ct: ct)Yêu cầu-phản hồi, chờ một TResponse đã được ghép tương ứng (ValueTask<TResponse>).
Task<TResponse>_session.RequestAsync<TResponse>(request, options, ct: ct).AsTask()Yêu cầu-phản hồi, chờ một TResponse đã được ghép tương ứng (Task<TResponse>).
RpcCall<TResponse>new RpcCall<TResponse>(_session, request, options)Handle lệnh gọi RPC có cấu trúc, có thể await (GetResponseAsync() / GetAwaiter()).
RpcStream<TResponse>new RpcStream<TResponse>(_session, request, options)Handle RPC streaming từ máy chủ đến client (GetStreamAsync() / GetAsyncEnumerator()), trong đó TResponse : IPacketStreamable.

Ví dụ

using System.Threading;
using System.Threading.Tasks;
using Nalix.Abstractions.Networking.Packets;
using Nalix.Abstractions.Networking.Rpc;

[RpcService]
public interface IInventoryService
{
    [PacketOpcode(0x2001)]
    ValueTask<InventoryResponse> GetInventoryAsync(
        InventoryRequest request,
        CancellationToken ct = default);
}

Khi chạy, lấy proxy client được sinh từ bất kỳ ITransportSession nào qua CreateRpcClient<TService>():

using Nalix.SDK.Transport.Extensions;

IInventoryService inventory = session.CreateRpcClient<IInventoryService>();
InventoryResponse response = await inventory.GetInventoryAsync(
    new InventoryRequest { PlayerId = 42 },
    ct);

API liên quan