Przejdź do treści

KRET LANGUAGE ACADEMY · DOKUMENTACJA ZE ŹRÓDEŁ

KretBridge: generacja C# i kontrola wywołań (bez uruchamiania usługi)

INTERMEDIATEVALIDATION_ONLYKretBridge

Szablon SDK `csharp-bridge`: kontrakt `Bridge/calc.klink`, kod KretS `use Kret.Bridge.demo.calc as calc`. `kret bridge generate` tworzy interfejs C#, a `kret check` sprawdza każde wywołanie `calc.*` względem kontraktu. **Usługa C# nie jest uruchamiana**: KretBridge to PROVISIONAL_VERSIONED, w Core zablokowany (FB-07), a proces usługi nie jest piaskownicą.

Edycja i zapisane wyniki

Witryna nie wykonuje kodu ani nie prowadzi walidacji SDK. Wyniki poniżej pochodzą z eksportu określonej wersji i przestają opisywać kod po jego zmianie.

Pobierz źródła JSON

Format tego przykładu nie jest obsługiwany przez edytor Playground. Źródła i instrukcje pozostają dostępne.

Kanoniczne pliki projektu

// <auto-generated>
//   Kod wygenerowany z kontraktu KretLink „demo.calc” 1.0.0 (sha256 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25).
//   Nie edytuj ręcznie: zmień plik .klink i uruchom „kret bridge generate”.
// </auto-generated>
#nullable enable
using System.Runtime.CompilerServices;
using System.Text.Json;
using Kret.Bridge;
using Kret.Common;
using Kret.Link;

namespace Kret.Examples.Bridge;

/// <summary>Usługa demo.calc 1.0.0. Implementacja działa w procesie usługi KretBridge.</summary>
public interface IDemoCalc
{
    /// <summary>Suma dwóch liczb całkowitych.</summary>
    Task<long> AddAsync(long a, long b, LinkCallContext context, CancellationToken cancellation);
    /// <summary>Kończy proces usługi w trakcie wywołania (test awarii).</summary>
    Task<long> CrashAsync(LinkCallContext context, CancellationToken cancellation);
    /// <summary>Opis złożony z nazwy i posortowanych etykiet.</summary>
    Task<string> DescribeAsync(string name, IReadOnlyDictionary<string, string> tags, LinkCallContext context, CancellationToken cancellation);
    /// <summary>Średnia; null dla pustej listy.</summary>
    Task<double?> MeanAsync(IReadOnlyList<double> values, LinkCallContext context, CancellationToken cancellation);
    /// <summary>Kolejne liczby pierwsze mniejsze od limitu.</summary>
    IAsyncEnumerable<long> PrimesAsync(long limit, LinkCallContext context, CancellationToken cancellation);
    /// <summary>Operacja wymagająca dodatkowego uprawnienia.</summary>
    Task PublishAsync(string text, LinkCallContext context, CancellationToken cancellation);
    /// <summary>Czeka podaną liczbę milisekund.</summary>
    Task<bool> SlowAsync(long ms, LinkCallContext context, CancellationToken cancellation);
}

/// <summary>Kontrakt usługi osadzony w kodzie — ten sam, z którego wygenerowano interfejs.</summary>
public static class DemoCalcContract
{
    public const string Service = "demo.calc";
    public const string Version = "1.0.0";
    public const string Digest = "0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25";
    public const string Json = """"{"format":"kretlink-contract/1","service":"demo.calc","version":"1.0.0","methods":[{"name":"add","description":"Suma dw\u00F3ch liczb ca\u0142kowitych.","params":[{"name":"a","type":"Int64"},{"name":"b","type":"Int64"}],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"crash","description":"Ko\u0144czy proces us\u0142ugi w trakcie wywo\u0142ania (test awarii).","params":[],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"describe","description":"Opis z\u0142o\u017Cony z nazwy i posortowanych etykiet.","params":[{"name":"name","type":"String"},{"name":"tags","type":"Map\u003CString, String\u003E"}],"returns":"String","stream":false,"permissions":[],"timeoutMs":5000},{"name":"mean","description":"\u015Arednia; null dla pustej listy.","params":[{"name":"values","type":"List\u003CFloat64\u003E"}],"returns":"Float64?","stream":false,"permissions":[],"timeoutMs":5000},{"name":"primes","description":"Kolejne liczby pierwsze mniejsze od limitu.","params":[{"name":"limit","type":"Int64"}],"returns":"Int64","stream":true,"permissions":[],"timeoutMs":5000},{"name":"publish","description":"Operacja wymagaj\u0105ca dodatkowego uprawnienia.","params":[{"name":"text","type":"String"}],"returns":"Unit","stream":false,"permissions":["kretlink.publish"],"timeoutMs":5000},{"name":"slow","description":"Czeka podan\u0105 liczb\u0119 milisekund.","params":[{"name":"ms","type":"Int64"}],"returns":"Bool","stream":false,"permissions":[],"timeoutMs":1000}]}"""";

    public static LinkContract Load()
    {
        var diagnostics = new KcsDiagnostics();
        return LinkContract.Read(System.Text.Encoding.UTF8.GetBytes(Json), diagnostics) ?? throw new InvalidOperationException("osadzony kontrakt jest niepoprawny: " + string.Join("; ", diagnostics.Items));
    }
}

/// <summary>Rejestracja metod usługi: odczyt argumentów, wywołanie implementacji, zapis wyniku.</summary>
public static class DemoCalcService
{
    public static LinkServer Register(LinkServer server, IDemoCalc implementation)
    {
        server.Handle("add", async (context, arguments, cancellation) =>
        {
            var result = await implementation.AddAsync(arguments[0].GetInt64(), arguments[1].GetInt64(), context, cancellation).ConfigureAwait(false);
            return BridgeJson.Text(writer => writer.WriteNumberValue(result));
        });
        server.Handle("crash", async (context, arguments, cancellation) =>
        {
            var result = await implementation.CrashAsync(context, cancellation).ConfigureAwait(false);
            return BridgeJson.Text(writer => writer.WriteNumberValue(result));
        });
        server.Handle("describe", async (context, arguments, cancellation) =>
        {
            var result = await implementation.DescribeAsync(arguments[0].GetString()!, BridgeJson.Map(arguments[1], e0 => e0.GetString()!), context, cancellation).ConfigureAwait(false);
            return BridgeJson.Text(writer => writer.WriteStringValue(result));
        });
        server.Handle("mean", async (context, arguments, cancellation) =>
        {
            var result = await implementation.MeanAsync(BridgeJson.List(arguments[0], e0 => e0.GetDouble()), context, cancellation).ConfigureAwait(false);
            return BridgeJson.Text(writer => BridgeJson.WriteOptionalValue(writer, result, (w0, v0) => w0.WriteNumberValue(v0)));
        });
        server.HandleStream("primes", (context, arguments, cancellation) => PrimesItems(implementation, context, arguments, cancellation));
        server.Handle("publish", async (context, arguments, cancellation) =>
        {
            await implementation.PublishAsync(arguments[0].GetString()!, context, cancellation).ConfigureAwait(false);
            return "null";
        });
        server.Handle("slow", async (context, arguments, cancellation) =>
        {
            var result = await implementation.SlowAsync(arguments[0].GetInt64(), context, cancellation).ConfigureAwait(false);
            return BridgeJson.Text(writer => writer.WriteBooleanValue(result));
        });
        return server;
    }

    private static async IAsyncEnumerable<string> PrimesItems(IDemoCalc implementation, LinkCallContext context, JsonElement arguments, [EnumeratorCancellation] CancellationToken cancellation)
    {
        await foreach (var item in implementation.PrimesAsync(arguments[0].GetInt64(), context, cancellation).WithCancellation(cancellation).ConfigureAwait(false))
            yield return BridgeJson.Text(writer => writer.WriteNumberValue(item));
    }
}

/// <summary>Typowany klient usługi demo.calc dla kodu C#.</summary>
public sealed class DemoCalcClient(LinkClient client)
{
    public async Task<long> AddAsync(long a, long b, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
        BridgeJson.Parse(await client.CallAsync("add", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(a); writer.WriteNumberValue(b); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetInt64());

    public async Task<long> CrashAsync(TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
        BridgeJson.Parse(await client.CallAsync("crash", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetInt64());

    public async Task<string> DescribeAsync(string name, IReadOnlyDictionary<string, string> tags, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
        BridgeJson.Parse(await client.CallAsync("describe", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteStringValue(name); BridgeJson.WriteMap(writer, tags, (w0, v0) => w0.WriteStringValue(v0)); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetString()!);

    public async Task<double?> MeanAsync(IReadOnlyList<double> values, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
        BridgeJson.Parse(await client.CallAsync("mean", BridgeJson.Text(writer => { writer.WriteStartArray(); BridgeJson.WriteList(writer, values, (w0, v0) => w0.WriteNumberValue(v0)); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => BridgeJson.OptionalValue(e, e0 => e0.GetDouble()));

    public async IAsyncEnumerable<long> PrimesAsync(long limit, int window = 16, [EnumeratorCancellation] CancellationToken cancellation = default)
    {
        await foreach (var item in client.StreamAsync("primes", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(limit); writer.WriteEndArray(); }), window, cancellation: cancellation).ConfigureAwait(false))
            yield return BridgeJson.Parse(item, e => e.GetInt64());
    }

    public async Task PublishAsync(string text, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
        await client.CallAsync("publish", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteStringValue(text); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false);

    public async Task<bool> SlowAsync(long ms, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>
        BridgeJson.Parse(await client.CallAsync("slow", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(ms); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetBoolean());
}

Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. // <auto-generated>Komentarz autora; nie jest wykonywany.
  2. // Kod wygenerowany z kontraktu KretLink „demo.calc” 1.0.0 (sha256 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25).Komentarz autora; nie jest wykonywany.
  3. // Nie edytuj ręcznie: zmień plik .klink i uruchom „kret bridge generate”.Komentarz autora; nie jest wykonywany.
  4. // </auto-generated>Komentarz autora; nie jest wykonywany.
  5. #nullable enableOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. using System.Runtime.CompilerServices;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  7. using System.Text.Json;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. using Kret.Bridge;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  9. using Kret.Common;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  10. using Kret.Link;Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  11. Pusta linia oddziela fragmenty źródła.
  12. namespace Kret.Examples.Bridge;Pole tożsamości lub wersji w otaczającym bloku; zachowaj jego kontekst.
  13. Pusta linia oddziela fragmenty źródła.
  14. /// <summary>Usługa demo.calc 1.0.0. Implementacja działa w procesie usługi KretBridge.</summary>Komentarz autora; nie jest wykonywany.
  15. public interface IDemoCalcOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  16. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  17. /// <summary>Suma dwóch liczb całkowitych.</summary>Komentarz autora; nie jest wykonywany.
  18. Task<long> AddAsync(long a, long b, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  19. /// <summary>Kończy proces usługi w trakcie wywołania (test awarii).</summary>Komentarz autora; nie jest wykonywany.
  20. Task<long> CrashAsync(LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  21. /// <summary>Opis złożony z nazwy i posortowanych etykiet.</summary>Komentarz autora; nie jest wykonywany.
  22. Task<string> DescribeAsync(string name, IReadOnlyDictionary<string, string> tags, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  23. /// <summary>Średnia; null dla pustej listy.</summary>Komentarz autora; nie jest wykonywany.
  24. Task<double?> MeanAsync(IReadOnlyList<double> values, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  25. /// <summary>Kolejne liczby pierwsze mniejsze od limitu.</summary>Komentarz autora; nie jest wykonywany.
  26. IAsyncEnumerable<long> PrimesAsync(long limit, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  27. /// <summary>Operacja wymagająca dodatkowego uprawnienia.</summary>Komentarz autora; nie jest wykonywany.
  28. Task PublishAsync(string text, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  29. /// <summary>Czeka podaną liczbę milisekund.</summary>Komentarz autora; nie jest wykonywany.
  30. Task<bool> SlowAsync(long ms, LinkCallContext context, CancellationToken cancellation);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  31. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  32. Pusta linia oddziela fragmenty źródła.
  33. /// <summary>Kontrakt usługi osadzony w kodzie — ten sam, z którego wygenerowano interfejs.</summary>Komentarz autora; nie jest wykonywany.
  34. public static class DemoCalcContractOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  35. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  36. public const string Service = "demo.calc";Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  37. public const string Version = "1.0.0";Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  38. public const string Digest = "0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25";Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  39. public const string Json = """"{"format":"kretlink-contract/1","service":"demo.calc","version":"1.0.0","methods":[{"name":"add","description":"Suma dw\u00F3ch liczb ca\u0142kowitych.","params":[{"name":"a","type":"Int64"},{"name":"b","type":"Int64"}],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"crash","description":"Ko\u0144czy proces us\u0142ugi w trakcie wywo\u0142ania (test awarii).","params":[],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"describe","description":"Opis z\u0142o\u017Cony z nazwy i posortowanych etykiet.","params":[{"name":"name","type":"String"},{"name":"tags","type":"Map\u003CString, String\u003E"}],"returns":"String","stream":false,"permissions":[],"timeoutMs":5000},{"name":"mean","description":"\u015Arednia; null dla pustej listy.","params":[{"name":"values","type":"List\u003CFloat64\u003E"}],"returns":"Float64?","stream":false,"permissions":[],"timeoutMs":5000},{"name":"primes","description":"Kolejne liczby pierwsze mniejsze od limitu.","params":[{"name":"limit","type":"Int64"}],"returns":"Int64","stream":true,"permissions":[],"timeoutMs":5000},{"name":"publish","description":"Operacja wymagaj\u0105ca dodatkowego uprawnienia.","params":[{"name":"text","type":"String"}],"returns":"Unit","stream":false,"permissions":["kretlink.publish"],"timeoutMs":5000},{"name":"slow","description":"Czeka podan\u0105 liczb\u0119 milisekund.","params":[{"name":"ms","type":"Int64"}],"returns":"Bool","stream":false,"permissions":[],"timeoutMs":1000}]}"""";Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  40. Pusta linia oddziela fragmenty źródła.
  41. public static LinkContract Load()Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  42. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  43. var diagnostics = new KcsDiagnostics();Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  44. return LinkContract.Read(System.Text.Encoding.UTF8.GetBytes(Json), diagnostics) ?? throw new InvalidOperationException("osadzony kontrakt jest niepoprawny: " + string.Join("; ", diagnostics.Items));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  45. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  46. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  47. Pusta linia oddziela fragmenty źródła.
  48. /// <summary>Rejestracja metod usługi: odczyt argumentów, wywołanie implementacji, zapis wyniku.</summary>Komentarz autora; nie jest wykonywany.
  49. public static class DemoCalcServiceOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  50. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  51. public static LinkServer Register(LinkServer server, IDemoCalc implementation)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  52. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  53. server.Handle("add", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  54. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  55. var result = await implementation.AddAsync(arguments[0].GetInt64(), arguments[1].GetInt64(), context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  56. return BridgeJson.Text(writer => writer.WriteNumberValue(result));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  57. });Zamknięcie struktury otwartej we wcześniejszych liniach.
  58. server.Handle("crash", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  59. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  60. var result = await implementation.CrashAsync(context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  61. return BridgeJson.Text(writer => writer.WriteNumberValue(result));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  62. });Zamknięcie struktury otwartej we wcześniejszych liniach.
  63. server.Handle("describe", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  64. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  65. var result = await implementation.DescribeAsync(arguments[0].GetString()!, BridgeJson.Map(arguments[1], e0 => e0.GetString()!), context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  66. return BridgeJson.Text(writer => writer.WriteStringValue(result));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  67. });Zamknięcie struktury otwartej we wcześniejszych liniach.
  68. server.Handle("mean", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  69. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  70. var result = await implementation.MeanAsync(BridgeJson.List(arguments[0], e0 => e0.GetDouble()), context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  71. return BridgeJson.Text(writer => BridgeJson.WriteOptionalValue(writer, result, (w0, v0) => w0.WriteNumberValue(v0)));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  72. });Zamknięcie struktury otwartej we wcześniejszych liniach.
  73. server.HandleStream("primes", (context, arguments, cancellation) => PrimesItems(implementation, context, arguments, cancellation));Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  74. server.Handle("publish", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  75. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  76. await implementation.PublishAsync(arguments[0].GetString()!, context, cancellation).ConfigureAwait(false);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  77. return "null";Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  78. });Zamknięcie struktury otwartej we wcześniejszych liniach.
  79. server.Handle("slow", async (context, arguments, cancellation) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  80. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  81. var result = await implementation.SlowAsync(arguments[0].GetInt64(), context, cancellation).ConfigureAwait(false);Wiązanie wartości; typ i możliwość zmiany zależą od użytej deklaracji.
  82. return BridgeJson.Text(writer => writer.WriteBooleanValue(result));Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  83. });Zamknięcie struktury otwartej we wcześniejszych liniach.
  84. return server;Zwrócenie wartości z funkcji; nie jest zapisem do dziennika.
  85. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  86. Pusta linia oddziela fragmenty źródła.
  87. private static async IAsyncEnumerable<string> PrimesItems(IDemoCalc implementation, LinkCallContext context, JsonElement arguments, [EnumeratorCancellation] CancellationToken cancellation)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  88. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  89. await foreach (var item in implementation.PrimesAsync(arguments[0].GetInt64(), context, cancellation).WithCancellation(cancellation).ConfigureAwait(false))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  90. yield return BridgeJson.Text(writer => writer.WriteNumberValue(item));Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  91. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  92. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  93. Pusta linia oddziela fragmenty źródła.
  94. /// <summary>Typowany klient usługi demo.calc dla kodu C#.</summary>Komentarz autora; nie jest wykonywany.
  95. public sealed class DemoCalcClient(LinkClient client)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  96. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  97. public async Task<long> AddAsync(long a, long b, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  98. BridgeJson.Parse(await client.CallAsync("add", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(a); writer.WriteNumberValue(b); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetInt64());Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  99. Pusta linia oddziela fragmenty źródła.
  100. public async Task<long> CrashAsync(TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  101. BridgeJson.Parse(await client.CallAsync("crash", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetInt64());Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  102. Pusta linia oddziela fragmenty źródła.
  103. public async Task<string> DescribeAsync(string name, IReadOnlyDictionary<string, string> tags, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  104. BridgeJson.Parse(await client.CallAsync("describe", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteStringValue(name); BridgeJson.WriteMap(writer, tags, (w0, v0) => w0.WriteStringValue(v0)); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetString()!);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  105. Pusta linia oddziela fragmenty źródła.
  106. public async Task<double?> MeanAsync(IReadOnlyList<double> values, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  107. BridgeJson.Parse(await client.CallAsync("mean", BridgeJson.Text(writer => { writer.WriteStartArray(); BridgeJson.WriteList(writer, values, (w0, v0) => w0.WriteNumberValue(v0)); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => BridgeJson.OptionalValue(e, e0 => e0.GetDouble()));Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  108. Pusta linia oddziela fragmenty źródła.
  109. public async IAsyncEnumerable<long> PrimesAsync(long limit, int window = 16, [EnumeratorCancellation] CancellationToken cancellation = default)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  110. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  111. await foreach (var item in client.StreamAsync("primes", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(limit); writer.WriteEndArray(); }), window, cancellation: cancellation).ConfigureAwait(false))Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  112. yield return BridgeJson.Parse(item, e => e.GetInt64());Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  113. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  114. Pusta linia oddziela fragmenty źródła.
  115. public async Task PublishAsync(string text, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  116. await client.CallAsync("publish", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteStringValue(text); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false);Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  117. Pusta linia oddziela fragmenty źródła.
  118. public async Task<bool> SlowAsync(long ms, TimeSpan? timeout = null, string? traceId = null, CancellationToken cancellation = default) =>Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  119. BridgeJson.Parse(await client.CallAsync("slow", BridgeJson.Text(writer => { writer.WriteStartArray(); writer.WriteNumberValue(ms); writer.WriteEndArray(); }), timeout, traceId, cancellation).ConfigureAwait(false), e => e.GetBoolean());Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  120. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  121. Pusta linia oddziela fragmenty źródła.

Wynik i typowy błąd

Kod 0 we wszystkich krokach; plik C# ma tę samą treść co `BridgeHost/Calc.g.cs` szablonu (generator deterministyczny).

Na co uważać

Uznanie KretBridge za mechanizm izolacji. Usługa C# działa z prawami użytkownika — uruchamiaj tylko zaufane usługi i tylko w trybie deweloperskim SDK (`kret run --bridge`).

Wymagania wersji i procedura lokalna

sdk
1.0.0-rc.3+kret.local.3
sdkInfoReports
1.0.0-rc.3
core
1.0.0-test.6.11-draft.1
os
Windows 11 x64
dotnet
.NET 10 runtime

Polecenia poniżej są instrukcją do samodzielnego wykonania z właściwym lokalnym SDK. DATA/OUT muszą wskazywać nowe katalogi testowe. Nie ma przycisku uruchamiania na serwerze.

  1. link-compilekret link compile Bridge/calc.klinkKatalog: project · Oczekiwany kod wyjścia: 0
  2. generatekret bridge generate Bridge/calc.klink -o {OUT}/Calc.g.csKatalog: project · Oczekiwany kod wyjścia: 0
  3. checkkret check . --jsonKatalog: project · Oczekiwany kod wyjścia: 0

Wyniki zapisane w pakiecie źródłowym

To dowód z eksportu, nie wynik bieżącego wykonania w przeglądarce.

# EXPECTED_OUTPUT — KRETBRIDGE-I01-GenerateAndCheck
# Rzeczywisty wynik uruchomienia (SDK 1.0.0-rc.3+kret.local.3, 2026-11-01T12:46:21Z). Ścieżki zastąpione znacznikami <project>, <data>, <out>, <sdk>.
# Actual output of the run. Paths replaced by placeholders.

### 1. link-compile  (exit 0, PASS)
> kret link compile Bridge/calc.klink
{"format":"kretlink-contract/1","service":"demo.calc","version":"1.0.0","methods":[{"name":"add","description":"Suma dw\u00F3ch liczb ca\u0142kowitych.","params":[{"name":"a","type":"Int64"},{"name":"b","type":"Int64"}],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"crash","description":"Ko\u0144czy proces us\u0142ugi w trakcie wywo\u0142ania (test awarii).","params":[],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"describe","description":"Opis z\u0142o\u017Cony z nazwy i posortowanych etykiet.","params":[{"name":"name","type":"String"},{"name":"tags","type":"Map\u003CString, String\u003E"}],"returns":"String","stream":false,"permissions":[],"timeoutMs":5000},{"name":"mean","description":"\u015Arednia; null dla pustej listy.","params":[{"name":"values","type":"List\u003CFloat64\u003E"}],"returns":"Float64?","stream":false,"permissions":[],"timeoutMs":5000},{"name":"primes","description":"Kolejne liczby pierwsze mniejsze od limitu.","params":[{"name":"limit","type":"Int64"}],"returns":"Int64","stream":true,"permissions":[],"timeoutMs":5000},{"name":"publish","description":"Operacja wymagaj\u0105ca dodatkowego uprawnienia.","params":[{"name":"text","type":"String"}],"returns":"Unit","stream":false,"permissions":["kretlink.publish"],"timeoutMs":5000},{"name":"slow","description":"Czeka podan\u0105 liczb\u0119 milisekund.","params":[{"name":"ms","type":"Int64"}],"returns":"Bool","stream":false,"permissions":[],"timeoutMs":1000}]}

[stderr]
Bridge/calc.klink(41,5): warning KCS-LNK-0121: stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0
OK: demo.calc 1.0.0, metod: 7, sha256: 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25

### 2. generate  (exit 0, PASS)
> kret bridge generate Bridge/calc.klink -o {OUT}/Calc.g.cs

[stderr]
Bridge/calc.klink(41,5): warning KCS-LNK-0121: stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0
OK: demo.calc 1.0.0, sha256: 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25

### 3. check  (exit 0, PASS)
> kret check . --json
{
  "format": "kret-diagnostics/1",
  "project": "<project>",
  "succeeded": true,
  "plugin": {
    "id": "LOCAL-KPL-BRB2GENR",
    "name": "BridgeValidation",
    "version": "1.0.0",
    "profile": "standard",
    "database": false
  },
  "permissions": {
    "required": [
      "logs.own.write",
      "kretlink.connect",
      "kretlink.consume"
    ],
    "optional": []
  },
  "handlers": {
    "lifecycle": [
      "start",
      "shutdown"
    ],
    "events": [],
    "commands": [
      "bridge.crash",
      "bridge.slow",
      "bridge.publish"
    ]
  },
  "diagnostics": [
    {
      "file": "<project>\\Bridge\\calc.klink",
      "line": 41,
      "column": 5,
      "endLine": 41,
      "endColumn": 11,
      "severity": "warning",
      "code": "KCS-LNK-0121",
      "message": "stream primes: metody strumieniowe s\u0105 eksperymentalne \u2014 transport strumieni nie jest zatwierdzony (D-KCS-13) i nie nale\u017Cy do Stable 1.0"
    }
  ]
}


Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. # EXPECTED_OUTPUT — KRETBRIDGE-I01-GenerateAndCheckOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. # Rzeczywisty wynik uruchomienia (SDK 1.0.0-rc.3+kret.local.3, 2026-11-01T12:46:21Z). Ścieżki zastąpione znacznikami <project>, <data>, <out>, <sdk>.Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  3. # Actual output of the run. Paths replaced by placeholders.Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  4. Pusta linia oddziela fragmenty źródła.
  5. ### 1. link-compile (exit 0, PASS)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  6. > kret link compile Bridge/calc.klinkOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  7. {"format":"kretlink-contract/1","service":"demo.calc","version":"1.0.0","methods":[{"name":"add","description":"Suma dw\u00F3ch liczb ca\u0142kowitych.","params":[{"name":"a","type":"Int64"},{"name":"b","type":"Int64"}],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"crash","description":"Ko\u0144czy proces us\u0142ugi w trakcie wywo\u0142ania (test awarii).","params":[],"returns":"Int64","stream":false,"permissions":[],"timeoutMs":5000},{"name":"describe","description":"Opis z\u0142o\u017Cony z nazwy i posortowanych etykiet.","params":[{"name":"name","type":"String"},{"name":"tags","type":"Map\u003CString, String\u003E"}],"returns":"String","stream":false,"permissions":[],"timeoutMs":5000},{"name":"mean","description":"\u015Arednia; null dla pustej listy.","params":[{"name":"values","type":"List\u003CFloat64\u003E"}],"returns":"Float64?","stream":false,"permissions":[],"timeoutMs":5000},{"name":"primes","description":"Kolejne liczby pierwsze mniejsze od limitu.","params":[{"name":"limit","type":"Int64"}],"returns":"Int64","stream":true,"permissions":[],"timeoutMs":5000},{"name":"publish","description":"Operacja wymagaj\u0105ca dodatkowego uprawnienia.","params":[{"name":"text","type":"String"}],"returns":"Unit","stream":false,"permissions":["kretlink.publish"],"timeoutMs":5000},{"name":"slow","description":"Czeka podan\u0105 liczb\u0119 milisekund.","params":[{"name":"ms","type":"Int64"}],"returns":"Bool","stream":false,"permissions":[],"timeoutMs":1000}]}Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. Pusta linia oddziela fragmenty źródła.
  9. [stderr]Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  10. Bridge/calc.klink(41,5): warning KCS-LNK-0121: stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  11. OK: demo.calc 1.0.0, metod: 7, sha256: 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  12. Pusta linia oddziela fragmenty źródła.
  13. ### 2. generate (exit 0, PASS)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  14. > kret bridge generate Bridge/calc.klink -o {OUT}/Calc.g.csOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  15. Pusta linia oddziela fragmenty źródła.
  16. [stderr]Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  17. Bridge/calc.klink(41,5): warning KCS-LNK-0121: stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  18. OK: demo.calc 1.0.0, sha256: 0be0fd784c282fec55b20706a7d2cde62777d33561a9e0256411ecdf60078e25Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  19. Pusta linia oddziela fragmenty źródła.
  20. ### 3. check (exit 0, PASS)Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  21. > kret check . --jsonOdczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  22. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  23. "format": "kret-diagnostics/1",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  24. "project": "<project>",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  25. "succeeded": true,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  26. "plugin": {Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  27. "id": "LOCAL-KPL-BRB2GENR",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  28. "name": "BridgeValidation",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  29. "version": "1.0.0",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  30. "profile": "standard",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  31. "database": falsePole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  32. },Zamknięcie struktury otwartej we wcześniejszych liniach.
  33. "permissions": {Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  34. "required": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  35. "logs.own.write",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  36. "kretlink.connect",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  37. "kretlink.consume"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  38. ],Zamknięcie struktury otwartej we wcześniejszych liniach.
  39. "optional": []Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  40. },Zamknięcie struktury otwartej we wcześniejszych liniach.
  41. "handlers": {Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  42. "lifecycle": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  43. "start",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  44. "shutdown"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  45. ],Zamknięcie struktury otwartej we wcześniejszych liniach.
  46. "events": [],Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  47. "commands": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  48. "bridge.crash",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  49. "bridge.slow",Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  50. "bridge.publish"Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  51. ]Zamknięcie struktury otwartej we wcześniejszych liniach.
  52. },Zamknięcie struktury otwartej we wcześniejszych liniach.
  53. "diagnostics": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  54. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  55. "file": "<project>\\Bridge\\calc.klink",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  56. "line": 41,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  57. "column": 5,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  58. "endLine": 41,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  59. "endColumn": 11,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  60. "severity": "warning",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  61. "code": "KCS-LNK-0121",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  62. "message": "stream primes: metody strumieniowe s\u0105 eksperymentalne \u2014 transport strumieni nie jest zatwierdzony (D-KCS-13) i nie nale\u017Cy do Stable 1.0"Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  63. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  64. ]Zamknięcie struktury otwartej we wcześniejszych liniach.
  65. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  66. Pusta linia oddziela fragmenty źródła.
  67. Pusta linia oddziela fragmenty źródła.
Diagnostyka i raporty testów

{
  "format": "kretos-web-playground-diagnostics/1",
  "exampleId": "KRETBRIDGE-I01-GenerateAndCheck",
  "sdk": "1.0.0-rc.3+kret.local.3",
  "origin": "PRECOMPUTED",
  "diagnostics": [
    {
      "id": "diag.KRETBRIDGE-I01-GenerateAndCheck.3.1",
      "exampleId": "KRETBRIDGE-I01-GenerateAndCheck",
      "step": 3,
      "stepName": "check",
      "command": "kret check . --json",
      "exitCode": 0,
      "file": "Bridge/calc.klink",
      "line": 41,
      "column": 5,
      "endLine": 41,
      "endColumn": 11,
      "severity": "warning",
      "code": "KCS-LNK-0121",
      "message": "stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0",
      "origin": "PRECOMPUTED (kret check, SDK 1.0.0-rc.3+kret.local.3)"
    }
  ]
}
Czytanie kodu linia po linii

Objaśnienia struktury nie są walidacją semantyczną. Szczegółowy kontrakt opisują referencje i README przykładu.

  1. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  2. "format": "kretos-web-playground-diagnostics/1",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  3. "exampleId": "KRETBRIDGE-I01-GenerateAndCheck",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  4. "sdk": "1.0.0-rc.3+kret.local.3",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  5. "origin": "PRECOMPUTED",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  6. "diagnostics": [Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  7. {Odczytaj tę linię w kontekście otaczającego bloku i objaśnień autora poniżej.
  8. "id": "diag.KRETBRIDGE-I01-GenerateAndCheck.3.1",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  9. "exampleId": "KRETBRIDGE-I01-GenerateAndCheck",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  10. "step": 3,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  11. "stepName": "check",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  12. "command": "kret check . --json",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  13. "exitCode": 0,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  14. "file": "Bridge/calc.klink",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  15. "line": 41,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  16. "column": 5,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  17. "endLine": 41,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  18. "endColumn": 11,Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  19. "severity": "warning",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  20. "code": "KCS-LNK-0121",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  21. "message": "stream primes: metody strumieniowe są eksperymentalne — transport strumieni nie jest zatwierdzony (D-KCS-13) i nie należy do Stable 1.0",Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  22. "origin": "PRECOMPUTED (kret check, SDK 1.0.0-rc.3+kret.local.3)"Pole danych JSON; znaczenie wynika z wersjonowanego schematu pliku.
  23. }Zamknięcie struktury otwartej we wcześniejszych liniach.
  24. ]Zamknięcie struktury otwartej we wcześniejszych liniach.
  25. }Zamknięcie struktury otwartej we wcześniejszych liniach.
Pochodzenie i integralność

KRET_TECH_KRETBRIDGE.zip:KretBridge/Examples/INTERMEDIATE_GenerateAndCheck/example.json

02_PLAYGROUND/EXAMPLES/KRETBRIDGE-I01-GenerateAndCheck.json
SHA-256 73B0662D83D00A9A1D3C3A9CAE7936948DB31FC02EF15B15D7E3C40810CAB240

Materiały źródłowe do tego tematu

Przeczytaj powiązane rozdziały. Kod i kontrakty zachowano z importu; historia źródeł jest dostępna przy każdym rozdziale.

KRETBRIDGE-I01-GenerateAndCheck — KretBridge: generacja C# i kontrola wywołań (bez uruchamiania usługi)

KRETBRIDGE-I01-GenerateAndCheck — KretBridge: generacja C# i kontrola wywołań (bez uruchamiania usługi)

🇬🇧 English version below.
PoleWartość
TechnologiaKretBridge
PoziomINTERMEDIATE
KlasyfikacjaVALIDATION_ONLY — Tylko walidacja (bez wykonania)
PlaygroundLOCAL_VALIDATE — lokalnie: walidacja (kret check, lokalny walidator Playground)
SDK1.0.0-rc.3+kret.local.3 (kandydat lokalny, niepodpisany)
Wynik testuTEST_RESULTS.json, rzeczywisty wynik: EXPECTED_OUTPUT.txt

Co pokazuje

Szablon SDK csharp-bridge: kontrakt Bridge/calc.klink, kod KretS use Kret.Bridge.demo.calc as calc. kret bridge generate tworzy interfejs C#, a kret check sprawdza każde wywołanie calc.* względem kontraktu. Usługa C# nie jest uruchamiana: KretBridge to PROVISIONAL_VERSIONED, w Core zablokowany (FB-07), a proces usługi nie jest piaskownicą.

Pliki

Plik
Bridge/calc.klink
BridgeHost/Calc.g.cs
BridgeHost/CalcBridge.csproj
BridgeHost/Program.cs
Script/Main.krs
host-policy.json
plugin.kretl

Jak uruchomić

Katalog roboczy: katalog tego przykładu. kret oznacza <SDK>\Compiler\kret.exe, kretui-host — <SDK>\UiHost\kretui-host.exe. {DATA} / {OUT} to nowe, puste katalogi poza projektem. Wymagania: REQUIREMENTS.md.

  1. kret link compile Bridge/calc.klink — kontrakt (metoda stream → ostrzeżenie)
  2. kret bridge generate Bridge/calc.klink -o {OUT}/Calc.g.cs — interfejs i klient C#
  3. kret check . --json — wywołania KretS ↔ kontrakt

Oczekiwany wynik

Kod 0 we wszystkich krokach; plik C# ma tę samą treść co BridgeHost/Calc.g.cs szablonu (generator deterministyczny).

Najczęstszy błąd

Uznanie KretBridge za mechanizm izolacji. Usługa C# działa z prawami użytkownika — uruchamiaj tylko zaufane usługi i tylko w trybie deweloperskim SDK (kret run --bridge).

Otwórz cały rozdział ze źródłem →

Zaloguj się na konto użytkownika, aby zapisywać postęp i zakładki. Konta obsługi mogą czytać bez zapisu postępu. Logowanie →

Wybierz, co możemy zapamiętać w tej przeglądarce. Możesz zmienić decyzję w każdej chwili.

Polityka prywatności