diff --git a/.gitignore b/.gitignore index 3e759b7..537eaeb 100644 --- a/.gitignore +++ b/.gitignore @@ -84,6 +84,8 @@ StyleCopReport.xml *.pidb *.svclog *.scc +*.dll +*.exe # Chutzpah Test files _Chutzpah* diff --git a/Capnp.Net.Runtime.Core21/Capnp.Net.Runtime.Core21.csproj b/Capnp.Net.Runtime.Core21/Capnp.Net.Runtime.Core21.csproj new file mode 100644 index 0000000..60c4831 --- /dev/null +++ b/Capnp.Net.Runtime.Core21/Capnp.Net.Runtime.Core21.csproj @@ -0,0 +1,113 @@ + + + + netcoreapp2.1 + true + Capnp.Net.Runtime + Christian Köllner and contributors + + capnproto-dotnetcore + A Cap'n Proto implementation for .NET Core, runtime assembly for .NET Core 2.1 + Christian Köllner and contributors + MIT + + https://github.com/c80k/capnproto-dotnetcore + https://github.com/c80k/capnproto-dotnetcore + Capnp.Net.Runtime + Capnp + Git + capnp "Cap'n Proto" RPC serialization cerealization + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Capnp.Net.Runtime.Tests.Core21/Capnp.Net.Runtime.Tests.Core21.csproj b/Capnp.Net.Runtime.Tests.Core21/Capnp.Net.Runtime.Tests.Core21.csproj new file mode 100644 index 0000000..a9005bb --- /dev/null +++ b/Capnp.Net.Runtime.Tests.Core21/Capnp.Net.Runtime.Tests.Core21.csproj @@ -0,0 +1,44 @@ + + + + netcoreapp2.2 + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Capnp.Net.Runtime.Tests/Capnp.Net.Runtime.Tests.csproj b/Capnp.Net.Runtime.Tests/Capnp.Net.Runtime.Tests.Std20.csproj similarity index 84% rename from Capnp.Net.Runtime.Tests/Capnp.Net.Runtime.Tests.csproj rename to Capnp.Net.Runtime.Tests/Capnp.Net.Runtime.Tests.Std20.csproj index 66c9807..d5e3394 100644 --- a/Capnp.Net.Runtime.Tests/Capnp.Net.Runtime.Tests.csproj +++ b/Capnp.Net.Runtime.Tests/Capnp.Net.Runtime.Tests.Std20.csproj @@ -1,11 +1,13 @@ - + - netcoreapp2.1 + netcoreapp2.2 false 7.1 + + Library diff --git a/Capnp.Net.Runtime.Tests/FramePumpTests.cs b/Capnp.Net.Runtime.Tests/FramePumpTests.cs index 0f13efb..2ebef32 100644 --- a/Capnp.Net.Runtime.Tests/FramePumpTests.cs +++ b/Capnp.Net.Runtime.Tests/FramePumpTests.cs @@ -111,7 +111,9 @@ namespace Capnp.Net.Runtime.Tests Assert.AreEqual(expectedCount - i, length); for (int j = 0; j < length; j++) { - Assert.AreEqual((ulong)(length - j), frame.Segments[i].Span[j]); + var expected = (ulong) (length - j); + var actual = frame.Segments[i].Span[j]; + Assert.AreEqual(expected, actual); } } @@ -165,7 +167,7 @@ namespace Capnp.Net.Runtime.Tests txPump.Send(PackFrame(4)); txPump.Send(PackFrame(5)); - Assert.IsTrue(SpinWait.SpinUntil(() => bc.Count == 8, 500)); + Assert.IsTrue(SpinWait.SpinUntil(() => bc.Count == 8, 50000)); UnpackAndVerifyFrame(bc.Take(), 1); UnpackAndVerifyFrame(bc.Take(), 8); diff --git a/Capnp.Net.Runtime.Tests/ProvidedCapabilityMultiCallMock.cs b/Capnp.Net.Runtime.Tests/ProvidedCapabilityMultiCallMock.cs index 50cccae..292c678 100644 --- a/Capnp.Net.Runtime.Tests/ProvidedCapabilityMultiCallMock.cs +++ b/Capnp.Net.Runtime.Tests/ProvidedCapabilityMultiCallMock.cs @@ -1,8 +1,8 @@ using System.Threading; using System.Threading.Tasks; +using System.Threading.Tasks.Dataflow; using Capnp.Rpc; using Microsoft.VisualStudio.TestTools.UnitTesting; -using System.Threading.Tasks.Dataflow; namespace Capnp.Net.Runtime.Tests { diff --git a/Capnp.Net.Runtime.Tests/TcpRpc.cs b/Capnp.Net.Runtime.Tests/TcpRpc.cs index bf27f0e..1412600 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpc.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpc.cs @@ -1,3 +1,4 @@ +using System; using System.Net; using System.Net.Sockets; using System.Threading; @@ -29,6 +30,7 @@ namespace Capnp.Net.Runtime.Tests { ExpectingLogOutput = true; + Logging.LoggerFactory?.Dispose(); Logging.LoggerFactory = new LoggerFactory().AddConsole((msg, level) => { if (!ExpectingLogOutput && level != LogLevel.Debug) @@ -41,7 +43,7 @@ namespace Capnp.Net.Runtime.Tests int MediumTimeout => Debugger.IsAttached ? Timeout.Infinite : 2000; - [TestMethod] + [TestMethod, Timeout(10000)] public void CreateAndDispose() { (var server, var client) = SetupClientServerPair(); @@ -52,7 +54,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void ConnectAndDispose() { (var server, var client) = SetupClientServerPair(); @@ -60,13 +62,21 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); - SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); - Assert.AreEqual(1, server.ConnectionCount); + try + { + client.WhenConnected.Wait(); + SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); + Assert.AreEqual(1, server.ConnectionCount); + } + catch (System.Exception e) + { + Console.WriteLine(e); + throw; + } } } - [TestMethod] + [TestMethod, Timeout(10000)] public void ConnectNoServer() { using (var client = new TcpRpcClient("localhost", TcpPort)) @@ -75,7 +85,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void ConnectAndBootstrap() { (var server, var client) = SetupClientServerPair(); @@ -83,7 +93,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -94,7 +104,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void ConnectNoBootstrap() { (var server, var client) = SetupClientServerPair(); @@ -102,7 +112,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -112,7 +122,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void CallReturn() { (var server, var client) = SetupClientServerPair(); @@ -120,7 +130,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -153,7 +163,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void CallCancelOnServer() { (var server, var client) = SetupClientServerPair(); @@ -161,7 +171,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -188,7 +198,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void CallCancelOnClient() { ExpectingLogOutput = false; @@ -200,7 +210,7 @@ namespace Capnp.Net.Runtime.Tests { try { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -233,7 +243,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void CallReturnAfterClientSideCancel() { ExpectingLogOutput = false; @@ -244,7 +254,7 @@ namespace Capnp.Net.Runtime.Tests { try { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -295,7 +305,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void CallServerSideException() { (var server, var client) = SetupClientServerPair(); @@ -303,7 +313,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -332,7 +342,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void PipelineBeforeReturn() { (var server, var client) = SetupClientServerPair(); @@ -340,7 +350,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -405,7 +415,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void PipelineAfterReturn() { (var server, var client) = SetupClientServerPair(); @@ -413,7 +423,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -481,7 +491,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void PipelineMultiple() { (var server, var client) = SetupClientServerPair(); @@ -489,7 +499,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -598,7 +608,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void PipelineCallAfterDisposal() { (var server, var client) = SetupClientServerPair(); @@ -606,7 +616,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); @@ -631,11 +641,21 @@ namespace Capnp.Net.Runtime.Tests args2.SetStruct(1, 0); args2.WriteData(0, 654321); - Assert.ThrowsException(() => pipelined.Call(0x8765432187654321, 0x4444, args2, false)); + try + { + pipelined.Call(0x8765432187654321, 0x4444, args2, false); + Assert.Fail("Expected an exception here"); + } + catch (ObjectDisposedException) + { + } + catch (TaskCanceledException) + { + } } } - [TestMethod] + [TestMethod, Timeout(10000)] public void PipelineCallDuringDisposal() { (var server, var client) = SetupClientServerPair(); @@ -643,7 +663,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumTimeout)); + client.WhenConnected.Wait(); SpinWait.SpinUntil(() => server.ConnectionCount > 0, MediumTimeout); Assert.AreEqual(1, server.ConnectionCount); diff --git a/Capnp.Net.Runtime.Tests/TcpRpcAdvancedStuff.cs b/Capnp.Net.Runtime.Tests/TcpRpcAdvancedStuff.cs index 9a7b6a6..fee316a 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcAdvancedStuff.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcAdvancedStuff.cs @@ -10,9 +10,9 @@ using System.Threading.Tasks; namespace Capnp.Net.Runtime.Tests { [TestClass] - public class TcpRpcAdvancedStuff: TestBase + public class TcpRpcAdvancedStuff : TestBase { - [TestMethod] + [TestMethod, Timeout(10000)] public void MultiConnect() { using (var server = SetupServer()) @@ -25,7 +25,7 @@ namespace Capnp.Net.Runtime.Tests { using (var client = SetupClient()) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -50,7 +50,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void TwoClients() { using (var server = SetupServer()) @@ -88,5 +88,37 @@ namespace Capnp.Net.Runtime.Tests } } } + + [TestMethod, Timeout(10000)] + public void ClosingServerWhileRequestingBootstrap() + { + for (int i = 0; i < 100; i++) + { + var server = SetupServer(); + var counters = new Counters(); + var tcs = new TaskCompletionSource(); + server.Main = new TestInterfaceImpl(counters, tcs); + + using (var client = SetupClient()) + { + client.WhenConnected.Wait(); + + using (var main = client.GetMain()) + { + server.Dispose(); + + // Resolution must either succeed or be cancelled. A hanging resolution would be inacceptable. + + try + { + Assert.IsTrue(((IResolvingCapability)main).WhenResolved.Wait(MediumNonDbgTimeout)); + } + catch (AggregateException) + { + } + } + } + } + } } } diff --git a/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs b/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs index 8b20837..949ea75 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcInterop.cs @@ -95,14 +95,14 @@ namespace Capnp.Net.Runtime.Tests Assert.AreEqual(expected, line.Result); } - [TestMethod] + [TestMethod, Timeout(10000)] public void BasicClient() { LaunchCompatTestProcess("server:Interface", stdout => { using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -126,7 +126,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void BasicServer() { using (var server = SetupServer()) @@ -143,7 +143,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void PipelineClient() { LaunchCompatTestProcess("server:Pipeline", stdout => @@ -152,7 +152,7 @@ namespace Capnp.Net.Runtime.Tests using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -180,7 +180,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void PipelineServer() { using (var server = SetupServer()) @@ -198,14 +198,14 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void ReleaseClient() { LaunchCompatTestProcess("server:MoreStuff", stdout => { using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -231,7 +231,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void ReleaseServer() { using (var server = SetupServer()) @@ -259,7 +259,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void ReleaseOnCancelClient() { // Since we have a threaded model, there is no way to deterministically provoke the situation @@ -271,7 +271,7 @@ namespace Capnp.Net.Runtime.Tests { using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -337,7 +337,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void ReleaseOnCancelServer() { using (var server = SetupServer()) @@ -354,14 +354,14 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void TestTailCallClient() { LaunchCompatTestProcess("server:TailCaller", stdout => { using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -389,7 +389,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000), Ignore] public void TestTailCallServer() { using (var server = SetupServer()) @@ -408,7 +408,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void CancelationServer() { LaunchCompatTestProcess("server:MoreStuff", stdout => @@ -417,7 +417,7 @@ namespace Capnp.Net.Runtime.Tests using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -432,13 +432,13 @@ namespace Capnp.Net.Runtime.Tests cts.Cancel(); Assert.IsTrue(destroyed.Task.Wait(MediumNonDbgTimeout)); - Assert.IsFalse(cancelTask.IsCompletedSuccessfully); + Assert.IsFalse(cancelTask.IsCompleted && !cancelTask.IsCanceled); } } }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void CancelationClient() { using (var server = SetupServer()) @@ -455,14 +455,14 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void PromiseResolveServer() { LaunchCompatTestProcess("server:MoreStuff", stdout => { using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -497,7 +497,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void PromiseResolveClient() { using (var server = SetupServer()) @@ -516,7 +516,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void RetainAndReleaseServer() { var destructionPromise = new TaskCompletionSource(); @@ -528,7 +528,7 @@ namespace Capnp.Net.Runtime.Tests using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -594,7 +594,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void RetainAndReleaseClient() { using (var server = SetupServer()) @@ -614,14 +614,14 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void CancelServer() { LaunchCompatTestProcess("server:MoreStuff", stdout => { using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var destructionPromise = new TaskCompletionSource(); var destructionTask = destructionPromise.Task; @@ -655,7 +655,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void CancelClient() { using (var server = SetupServer()) @@ -672,14 +672,14 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void SendTwiceServer() { LaunchCompatTestProcess("server:MoreStuff", stdout => { using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -716,7 +716,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void SendTwiceClient() { using (var server = SetupServer()) @@ -736,7 +736,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void EmbargoServer() { LaunchCompatTestProcess("server:MoreStuff", stdout => @@ -751,7 +751,19 @@ namespace Capnp.Net.Runtime.Tests using (var main = client.GetMain()) { var resolving = main as IResolvingCapability; - if (!resolving.WhenResolved.Wait(MediumNonDbgTimeout)) + + bool success; + + try + { + success = resolving.WhenResolved.Wait(MediumNonDbgTimeout); + } + catch + { + success = false; + } + + if (!success) { if (++retry == 5) { @@ -803,7 +815,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void EmbargoClient() { using (var server = SetupServer()) @@ -824,7 +836,7 @@ namespace Capnp.Net.Runtime.Tests using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -873,13 +885,13 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void EmbargoErrorServer() { LaunchCompatTestProcess("server:MoreStuff", EmbargoErrorImpl); } - [TestMethod] + [TestMethod, Timeout(10000)] public void RepeatedEmbargoError() { LaunchCompatTestProcess("server:MoreStuff", stdout => @@ -891,7 +903,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void EmbargoErrorClient() { using (var server = SetupServer()) @@ -907,7 +919,7 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void EmbargoNullServer() { LaunchCompatTestProcess("server:MoreStuff", stdout => @@ -917,13 +929,24 @@ namespace Capnp.Net.Runtime.Tests label: using (var client = new TcpRpcClient("localhost", TcpPort)) { - - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { var resolving = main as IResolvingCapability; - if (!resolving.WhenResolved.Wait(MediumNonDbgTimeout)) + + bool success; + + try + { + success = resolving.WhenResolved.Wait(MediumNonDbgTimeout); + } + catch + { + success = false; + } + + if (!success) { if (++retry == 5) { @@ -956,7 +979,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void EmbargoNullClient() { using (var server = SetupServer()) @@ -972,14 +995,14 @@ namespace Capnp.Net.Runtime.Tests } } - [TestMethod] + [TestMethod, Timeout(10000)] public void CallBrokenPromiseServer() { LaunchCompatTestProcess("server:MoreStuff", stdout => { using (var client = new TcpRpcClient("localhost", TcpPort)) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); using (var main = client.GetMain()) { @@ -1009,7 +1032,7 @@ namespace Capnp.Net.Runtime.Tests }); } - [TestMethod] + [TestMethod, Timeout(10000)] public void CallBrokenPromiseClient() { using (var server = SetupServer()) diff --git a/Capnp.Net.Runtime.Tests/TcpRpcPorted.cs b/Capnp.Net.Runtime.Tests/TcpRpcPorted.cs index a13b4a5..01658a8 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcPorted.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcPorted.cs @@ -22,7 +22,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); server.Main = new TestInterfaceImpl(counters); @@ -52,7 +52,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); server.Main = new TestPipelineImpl(counters); @@ -87,7 +87,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); server.Main = new TestMoreStuffImpl(counters); @@ -120,7 +120,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); server.Main = new TestMoreStuffImpl(counters); @@ -159,7 +159,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); server.Main = new TestTailCallerImpl(counters); @@ -196,7 +196,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); server.Main = new TestMoreStuffImpl(counters); @@ -212,7 +212,7 @@ namespace Capnp.Net.Runtime.Tests cts.Cancel(); Assert.IsTrue(destroyed.Task.Wait(MediumNonDbgTimeout)); - Assert.IsFalse(cancelTask.IsCompletedSuccessfully); + Assert.IsFalse(cancelTask.IsCompleted && !cancelTask.IsCanceled); } } @@ -226,7 +226,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); var impl = new TestMoreStuffImpl(counters); @@ -268,7 +268,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var destructionPromise = new TaskCompletionSource(); var destructionTask = destructionPromise.Task; @@ -345,7 +345,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var destructionPromise = new TaskCompletionSource(); var destructionTask = destructionPromise.Task; @@ -388,7 +388,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var destructionPromise = new TaskCompletionSource(); var destructionTask = destructionPromise.Task; @@ -435,7 +435,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); var impl = new TestMoreStuffImpl(counters); @@ -496,7 +496,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); var impl = new TestMoreStuffImpl(counters); @@ -553,7 +553,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); var impl = new TestMoreStuffImpl(counters); @@ -590,7 +590,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); var impl = new TestMoreStuffImpl(counters); diff --git a/Capnp.Net.Runtime.Tests/TcpRpcStress.cs b/Capnp.Net.Runtime.Tests/TcpRpcStress.cs index d8ae9cc..4bc3e00 100644 --- a/Capnp.Net.Runtime.Tests/TcpRpcStress.cs +++ b/Capnp.Net.Runtime.Tests/TcpRpcStress.cs @@ -13,8 +13,6 @@ namespace Capnp.Net.Runtime.Tests [TestClass] public class TcpRpcStress: TestBase { - ILogger Logger { get; set; } - void Repeat(int count, Action action) { for (int i = 0; i < count; i++) @@ -24,15 +22,6 @@ namespace Capnp.Net.Runtime.Tests } } - [TestInitialize] - public void InitConsoleLogging() - { - Logging.LoggerFactory = new LoggerFactory().AddConsole((msg, level) => true); - Logger = Logging.CreateLogger(); - if (Thread.CurrentThread.Name == null) - Thread.CurrentThread.Name = $"Test Thread {Thread.CurrentThread.ManagedThreadId}"; - } - [TestMethod] public void ResolveMain() { @@ -43,7 +32,7 @@ namespace Capnp.Net.Runtime.Tests using (server) using (client) { - Assert.IsTrue(client.WhenConnected.Wait(MediumNonDbgTimeout)); + client.WhenConnected.Wait(); var counters = new Counters(); var impl = new TestMoreStuffImpl(counters); diff --git a/Capnp.Net.Runtime.Tests/TestBase.cs b/Capnp.Net.Runtime.Tests/TestBase.cs index fc1e2b7..8ce04a6 100644 --- a/Capnp.Net.Runtime.Tests/TestBase.cs +++ b/Capnp.Net.Runtime.Tests/TestBase.cs @@ -33,6 +33,7 @@ namespace Capnp.Net.Runtime.Tests [TestInitialize] public void InitConsoleLogging() { + Logging.LoggerFactory?.Dispose(); Logging.LoggerFactory = new LoggerFactory().AddConsole((msg, level) => true); Logger = Logging.CreateLogger(); if (Thread.CurrentThread.Name == null) diff --git a/Capnp.Net.Runtime/Capnp.Net.Runtime.Std20.xml b/Capnp.Net.Runtime/Capnp.Net.Runtime.Std20.xml new file mode 100644 index 0000000..13cccfb --- /dev/null +++ b/Capnp.Net.Runtime/Capnp.Net.Runtime.Std20.xml @@ -0,0 +1,3608 @@ + + + + Capnp.Net.Runtime + + + + + Generic implementation, based on a wrapper around . + + + + + The will be set by the Deserialize method. + + + + + Sets the State property. + + deserializer state + + + + Performs a deep copy from State to given state. + + serializer state + + + + Provides functionality to construct domain objects from . + + + + + Constructs a domain object from a given deserializer state. + + Type of domain object to construct. Must be one of the following: + + Type implementing . The type must must have a public parameterless constructor. + A capability interface ( for further explanation) + + + + + + + + + + + + + whereby T is one of the things listed here. + + + + + + + + This exception gets thrown when a Cap'n Proto object could not be deserialized correctly. + + + + + Constructs an instance + + + + + Constructs an instance with message and inner exception + + + + + Implements the heart of deserialization. This stateful helper struct exposes all functionality to traverse serialized data. + Although it is public, you should not use it directly. Instead, use the reader, writer, and domain class adapters which are produced + by the code generator. + + + + + A wire message is essentially a collection of memory blocks. + + + + + Index of the segment (into the Segments property) which this state currently refers to. + + + + + Word offset within the current segment which this state currently refers to. + + + + + Context-dependent meaning: Usually the number of bytes traversed until this state was reached, to prevent amplification attacks. + However, if this state is of Kind == ObjectKind.Value (an artificial category which will never occur on the wire but is used to + internally represent lists of primitives as lists of structs), it contains the primitive's value. + + + + + If this state currently represents a list, the number of list elements. + + + + + If this state currently represents a struct, the struct's data section word count. + + + + + If this state currently represents a struct, the struct's pointer section word count. + + + + + The kind of object this state currently represents. + + + + + The capabilities imported from the capability table. Only valid in RPC context. + + + + + Current segment (essentially Segments[CurrentSegmentIndex] + + + + + Constructs a state representing a message root object. + + the message + + + + + Implicitly converts a serializer state into a deserializer state. + The conversion is cheap, since it does not involve copying any payload. + + The serializer state to be converted + + + + Constructs a state representing the given value. This kind of state is artificial and beyond the Cap'n Proto specification. + We need it to internally represent list of primitive values as lists of structs. + + + + + Increments the number of bytes traversed and checks the results against the traversal limit. + + Amount to increase the traversed bytes + + + + Memory span which represents this struct's data section (given this state actually represents a struct) + + + + + If this state represents a list of primitive values, returns the raw list data. + + + + + Interprets a pointer within the current segment and mutates this state to represent the pointer's target. + + word offset relative to this.Offset within current segment + offset negative or out of range + invalid pointer data or traversal limit exceeded + + + + Interprets a pointer within the current segment as capability pointer and returns the according low-level capability object from + the capability table. Does not mutate this state. + + Offset relative to this.Offset within current segment + the low-level capability object + offset negative or out of range + capability table not set + not a capability pointer or invalid capability index + + + + Reads a slice of up to 64 bits from this struct's data section, starting from the specified bit offset. + The slice must be aligned within a 64 bit word boundary. + + Start bit offset relative to the data section, little endian + numbers of bits to read + the data + non-aligned access + bitOffset exceeds the data section + this state does not represent a struct + + + + Decodes a pointer from this struct's pointer section and returns the state representing the pointer target. + It is valid to specify an index beyond the pointer section, in which case a default state (representing the "null object") + will be returned. This is to preserve upward compatibility with schema evolution. + + Index within the pointer section + the target state + this state does not represent a struct, + invalid pointer, or traversal limit exceeded + + + + Given this state represents a list (of anything), returns a ListDeserializer to further decode the list content. + + state does not represent a list + + + + Given this state represents a list of pointers, returns a ListOfCapsDeserializer for decoding it as list of capabilities. + + Capability interface + state does not represent a list of pointers + + + + Convenience method. Given this state represents a struct, decodes text field from its pointer table. + + index within this struct's pointer table + default text to return of pointer is null + the decoded text, or defaultText (which might be null) + negative index + state does not represent a struct, invalid pointer, + non-list-of-bytes pointer, traversal limit exceeded + + + + Convenience method. Given this state represents a struct, decodes a list deserializer field from its pointer table. + + index within this struct's pointer table + the list deserializer instance + negative index + state does not represent a struct, invalid pointer, + non-list pointer, traversal limit exceeded + + + + Convenience method. Given this state represents a struct, decodes a capability list field from its pointer table. + + Capability interface + index within this struct's pointer table + the capability list deserializer instance + negative index + state does not represent a struct, invalid pointer, + non-list-of-pointers pointer, traversal limit exceeded + + + + Convenience method. Given this state represents a struct, decodes a list of structs field from its pointer table. + + Struct target representation type + index within this struct's pointer table + constructs a target representation type instance from the underlying deserializer state + the decoded list of structs + negative index + state does not represent a struct, invalid pointer, + non-list-of-{structs,pointers} pointer, traversal limit exceeded + + + + Convenience method. Given this state represents a struct, decodes a struct field from its pointer table. + + Struct target representation type + index within this struct's pointer table + constructs a target representation type instance from the underlying deserializer state + the decoded struct + negative index + state does not represent a struct, invalid pointer, + non-struct pointer, traversal limit exceeded + + + + Given this state represents a capability, returns its index into the capability table. + + + + + Given this state represents a struct, decodes a capability field from its pointer table. + + Capability interface + index within this struct's pointer table + debugging aid + debugging aid + debugging aid + capability instance or null if pointer was null + negative index + state does not represent a struct, invalid pointer, + non-capability pointer, traversal limit exceeded + + + + Given this state represents a struct, decodes a capability field from its pointer table and + returns it as bare (generic) proxy. + + index within this struct's pointer table + capability instance or null if pointer was null + negative index + state does not represent a struct, invalid pointer, + non-capability pointer, traversal limit exceeded + + + + Given this state represents a capability, wraps it into a proxy instance for the desired interface. + + Capability interface + capability instance or null if pointer was null + negative index + state does not represent a capability + + + + This SerializerState specialization provides functionality to build arbitrary Cap'n Proto objects without requiring the schema code generator. + + + + + Constructs an unbound instance. + + + + + Constructs an instance and binds it to the given . + + message builder + + + + Constructs an instance, binds it to a dedicated message builder, and initializes the capability table for usage in RPC context. + + + + + Converts any to a DynamicSerializerState instance, which involves deep copying the object graph. + + The deserializer state to convert + + + + Links a sub-item (struct field or list element) of this state to another state. Usually, this operation is not necessary, since objects are constructed top-down. + However, there might be some advanced scenarios where you want to reference the same object twice (also interesting for designing amplification attacks). + The Cap'n Proto serialization intrinsically supports this, since messages are object graphs, not trees. + + If this state describes a struct: Index into this struct's pointer table. + If this state describes a list of pointers: List element index. + state to be linked + Whether to deep copy the target state if it belongs to a different message builder than this state. + is null + out of range + + This state does neither describe a struct, nor a list of pointers + Another state is already linked to the specified position (sorry, no overwrite allowed) + This state and belong to different message builder, and is false + + + + + Links a sub-item (struct field or list element) of this state to a capability. + + If this state describes a struct: Index into this struct's pointer table. + If this state describes a list of pointers: List element index. + capability index inside the capability table + + This state does neither describe a struct, nor a list of pointers + Another state is already linked to the specified position (sorry, no overwrite allowed) + + + + + Determines the underlying object to be a struct. + + Desired size of the struct's data section, in words + Desired size of the struct's pointer section, in words + The object type was already set to something different + + + + Determines the underlying object to be a list of (primitive) values. + + Element size in bits, must be 0 (void), 1 (bool), 8, 16, 32, or 64 + Desired element count + The object type was already set to something different + outside allowed range, + negative or exceeding 2^29-1 + + + + Determines the underlying object to be a list of pointers. + + Desired element count + The object type was already set to something different + negative or exceeding 2^29-1 + + + + Determines the underlying object to be a list of structs (fixed-width compound list). + + Desired element count + Desired size of each struct's data section, in words + Desired size of each struct's pointer section, in words + The object type was already set to something different + negative, or total word count would exceed 2^29-1 + + + + Constructs the underlying object from the given representation. + + Object representation. Must be one of the following: + + An instance implementing + null + A + A ]]> + A ]]> + A ]]> + A ]]> + A ]]> + A ]]> + A ]]> + A ]]> + A ]]> + A ]]> + A ]]> + A ]]> + Another + Another + Low-level capability object () + Proxy object () + Skeleton object () + Capability interface implementation + A ]]> whereby each list item is one of the things listed here. + + + + + + Implements an empty . + + + + + + Always throws an . + + Ignored + + + + Always 0. + + + + + Returns an empty enumerator. + + + + + ListDeserializer specialization for empty lists. + + + + + Always ListKind.ListOfEmpty (despite the fact the empty list != List(Void) + + + + + Returns am empty . + + Element ype + Ignored + + + + Returns an empty ]]>/>. + + + + + Returns an empty ]]>/>. + + + + + Returns an empty ]]>/>. + + + + + Returns an empty ]]>. + + + + + Returns an empty ]]>. + + + + + Returns an empty ]]>. + + + + + Returns an empty ]]>/>. + + + + + Returns an empty ]]>. + + + + + Returns an empty ]]>. + + + + + Returns an empty string. + + + + + Returns an empty ]]>. + + + + + Returns an empty ]]>. + + + + + Returns an empty ]]>. + + + + + The FramePump handles sending and receiving Cap'n Proto messages over a stream. It exposes a Send method for writing frames to the stream, and an + event handler for processing received frames. It does not fork any new thread by itself, but instead exposes a synchronous blocking Run method that + implements the receive loop. Invoke this method in the thread context of your choice. + + + + + Constructs a new instance for given stream. + + The stream for message I/O. + If you intend to receive messages, the stream must support reading (CanRead). + If you intend to send messages, the stream must support writing (CanWrite). + + is null. + + + + Disposes this instance and the underlying stream. This will also cause the Run method to return. + + + + + Event handler for frame reception. + + + + + Sends a message over the stream. + + Message to be sent + The underlying stream does not support writing. + The message does not provide at least one segment, or one of its segments is empty. + An I/O error occurs. + This instance or stream is diposed. + + + + Whether the pump is currently waiting for data to receive. + + + + + Synchronously runs the frame reception loop. Will only return after calling Dispose() or upon error condition. + The method does not propagate EndOfStreamException or ObjectDisposedException to the caller, since these conditions are considered + to be part of normal operation. It does pass exceptions which arise due to I/O errors or invalid data. + + The underlying stream does not support reading or is already closed. + Encountered Invalid Framing Data + Received a message with too many or too big segments, probably dues to invalid data. + An I/O error occurs. + + + + Supports the deserialization of Cap'n Proto messages from a stream (see https://capnproto.org/encoding.html#serialization-over-a-stream). + Packing and compression cannot be handled yet. + + + + + Deserializes a message from given stream. + + The stream to read from + The deserialized message + is null. + The stream does not support reading, is null, or is already closed. + The end of the stream is reached. + The stream is closed. + An I/O error occurs. + Encountered invalid framing data, too many or too large segments + Too many or too large segments, probably due to invalid framing data. + + + + Deserializes the next Cap'n Proto message from given stream. + + The stream to read from + The message + + + + This interface is intended to be implemented by schema-generated domain classes which support deserialization from + a and serialization to a . + + + + + Serializes the implementation's current state to a serializer state. + + Target serializer state + + + + Deserializes the implementation's state from a deserializer state. + + Source deserializer state + + + + Implements a segment allocation policy for Cap'n Proto building messages. + + + + + Currently allocated segments. + + + + + Attempts to allocate a memory block. The first allocation attempt is made inside the segment specified by . + If that segment does not provide enough space or does not exist, further actions depend on the flag. + If that flag is true, allocation will fail (return false). Otherwise, the allocation shall scan existing segments for the requested amount of space, + and create a new segment if none provides enough space. + + Number of words to allocate + Index of preferred segment wherein the block should be allocated + Position of allocated memory block (undefined in case of failure) + Whether the segment specified by is mandatory + Whether allocation was successful + + + + An implementations of this interface represents a struct which is being deserialized from a Cap'n Proto object. + + + + + Reads a slice of up to 64 bits from this struct's data section, starting from the specified bit offset. + The slice must be aligned within a 64 bit word boundary. + + Start bit offset relative to the data section, little endian + numbers of bits to read + the data + non-aligned access + bitOffset exceeds the data section + this state does not represent a struct + + + + An implementations of this interface represents a struct which is being serialized as Cap'n Proto object. + + + + + Writes data (up to 64 bits) into the underlying struct's data section. + The write operation must be aligned to fit within a single word. + + Start bit relative to the struct's data section, little endian + Number of bits to write + Data bits to write + The object was not determined to be a struct + The data slice specified by and + is not completely within the struct's data section, misaligned, exceeds one word, or is negative + + + + The struct's data section as memory span. + + + + + Base class for interpreting a as List(T). + + + + + Underlying deserializer state + + + + + This list's element count + + + + + The list's element category + + + + + Represents this list by applying a selector function to each element's deserializer state. + This operator is only supported by certain specializations. + + Target element type + Selector function + The desired representation + + + + Represents this list as a list of lists. + + The list of lists representation, each element being a on its own. + If this kind of list cannot be represented as list of lists (because it is a list of non-pointers) + + + + Represents this list as a list of capabilities. + + Capability interface + Capability list representation + If this kind of list cannot be represented as list of capabilities (because it is a list of non-pointers) + If does not qualify as capability interface. + + + + Represents this list as n-dimensional list of T, with T being a primitive type. + + Element type, must be primitive + Number of dimensions + The desired representation as >]]> + is less than or equal to 0 + If this list cannot be represented in the desired manner. + + + + Represents this list as n-dimensional list of T, with T being any type. + + Element type + Number of dimensions + Selector function which constructs an instance of from a + The desired representation as >]]> + is null. + is less than or equals 0. + If this list cannot be represented in the desired manner. + + + + Represents this list as n-dimensional list of enums. + + Enum type + Number of dimensions + Cast function which converts ushort value to enum value + The desired representation as >]]> + is null. + is less than or equals 0. + If this list cannot be represented in the desired manner. + + + + Represents this list as n-dimensional List(...List(Void)) + + Number of dimensions + The desired representation as >]]> + is less than or equals 0 + If this list cannot be represented in the desired manner. + + + + Represents this list as "matrix" (jagged array) with primitive element type. + + Element type, must be primitive + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Data). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as "matrix" (jagged array) with complex element type. + + Element type + Selector function which constructs an instance of from a + The desired representation + is null. + If this list cannot be represented in the desired manner. + + + + Represents this list as "matrix" (jagged array) of enum-typed elements. + + Enum type + Cast function which converts ushort value to enum value + The desired representation + is null. + If this list cannot be represented in the desired manner. + + + + Represents this list as 3-dimensional jagged array with primitive element type. + + Element type, must be primitive + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as 3-dimensional jagged array with complex element type. + + Element type + Selector function which constructs an instance of from a + The desired representation + is null. + If this list cannot be represented in the desired manner. + + + + Represents this list as 3-dimensional jagged array of enum-typed elements. + + Enum type + Cast function which converts ushort value to enum value + The desired representation + is null. + If this list cannot be represented in the desired manner. + + + + Represents this list as list of enum-typed elements. + + Enum type + Cast function which converts ushort value to enum value + The desired representation + is null. + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Void), which boils down to returning the number of elements. + + The List(Void) representation which is nothing but the list's element count. + + + + Represents this list as List(List(Void)), which boils down to returning a list of element counts. + + A list of integers whereby each number equals the sublist's element count. + If this list cannot be represented in the desired manner. + + + + Represents this list as List(List(List(Void))). + + The List(List(List(Void))) representation which is in turn a 2-dimensional jagged array of element counts. + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Text). For representing it as Text, use . + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as Text. For representing it as List(Text), use . + + + Did you notice that the naming pattern is broken here? For every other CastX method, X depicts the element type. + CastX actually means "represent this list as list of X". Logically, the semantics of CastText should be the semantics + implemented by CastText2. And this method's name should be "CastChar". This wouldn't be accurate either, since a string + is semantically more than the list of its characters. Trying to figure out a consistent naming pattern, we'd probably + end up in less concise method names (do you have a good suggestion?). Considering this and the fact that you probably + won't use these methods directly (because the code generator will produce nice wrappers for you) it seems acceptable to + live with the asymmetric and somewhat ugly naming. + + The decoded text + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Bool). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Int8). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(UInt8). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Int16). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(UInt16). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Int32). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(UInt32). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Int64). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(UInt64). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Float32). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Represents this list as List(Float64). + + The desired representation + If this list cannot be represented in the desired manner. + + + + Enumerates the list element categories which are defined by Cap'n Proto. + + + + + List(Void) + + + + + List(Bool) + + + + + List(Int8) or List(UInt8) + + + + + List(Int16), List(UInt16), or List(Enum) + + + + + List(Int32), List(UInt32), or List(Float32) + + + + + List(Int64), List(UInt64), or List(Float64) + + + + + A list of pointers + + + + + A list of fixed-size composites (i.e. structs) + + + + + ListDeserializer specialization for a List(Bool). + + + + + Always ListKind.ListOfBits + + + + + Gets the element at given index. + + Element index + Element value + is out of range. + + + + Implements + + + + + + Return this + + + + + Always throws since it is not intended to represent a list of bits differently. + + + + + SerializerState specialization for a List(Bool). + + + + + Gets or sets the element at given index. + + Element index + Element value + List was not initialized, or attempting to overwrite a non-null element. + is out of range. + + + + This list's element count. + + + + + Initializes this list with a specific size. The list can be initialized only once. + + List element count + The list was already initialized + is negative or greater than 2^29-1 + + + + Initializes the list with given content. + + List content. Can be null in which case the list is simply not initialized. + The list was already initialized + More than 2^29-1 items. + + + + Implements + + + + + ListDeserializer specialization for a list of capabilities. + + Capability interface + + + + Returns the capability at given index. + + Element index + The capability at given index (in terms of its proxy instance) + + + + Always ListKind.ListOfPointers + + + + + Always throws , since it is not intended to convert a capability list to anything else. + + + + + Implements . + + + + + + SerializerState specialization for a list of capabilities. + + Capability interface + + + + Constructs an instance. + + does not quality as capability interface. + The implementation might attempt to throw this exception earlier in the static constructor (during type load). Currently it doesn't + because there is a significant risk of messing something up and ending with a hard-to-debug . + + + + Gets or sets the capability at given element index. + + Element index + Proxy object of capability at given element index + List was not initialized, or attempting to overwrite an already set element. + is out of range. + + + + Initializes this list with a specific size. The list can be initialized only once. + + List element count + The list was already initialized + is negative or greater than 2^29-1 + + + + Initializes the list with given content. + + List content. Can be null in which case the list is simply not initialized. + The list was already initialized + More than 2^29-1 items. + + + + This list's element count. + + + + + Implements . + + + + + + ListDeserializer specialization for List(Void). + + + + + Returns a DeserializerState representing an element at given index. + This is always the null object, since Void cannot carry any data. + + Element index + default(DeserializerState) + is out of range. + + + + Always ListKind.ListOfEmpty + + + + + Applies a selector function to each element. + Trivia: Since each element is the null object, the selector function always gets fed with a null object. + + Element target type + Selector function + The desired representation + + + + Implements . + + + + + SerializerState specialization for List(Void). + + + + + This list's element count. + + + + + Initializes this list with a specific size. The list can be initialized only once. + + List element count + The list was already initialized + is negative or greater than 2^29-1 + + + + ListDeserializer specialization for List(T) when T is unknown (generic), List(Data), List(Text), and List(List(...)). + + + + + Always ListKind.ListOfPointers + + + + + Gets the DeserializerState representing the element at given index. + + Element index + DeserializerState representing the element at given index + + + + Implements . + + + + + Applies a selector function to each element. + + Element target type + Selector function + The desired representation + + + + Interprets this instance as List(List(...)). + + The desired representation. Since it is evaluated lazily, type conflicts will not happen before accessing the resulting list's elements. + + + + Interprets this instance as a list of capabilities. + + Capability interface + The desired representation. Since it is evaluated lazily, type conflicts will not happen before accessing the resulting list's elements. + + + + SerializerState specialization for List(T) when T is unknown (generic), List(Data), List(Text), and List(List(...)). + + SerializerState which represents the element type + + + + Gets or sets the element at given index. + + Element index + Serializer state representing the desired element + List was not initialized, or attempting to overwrite a non-null element. + is out of range. + + + + This list's element count. + + + + + Implements . + + + + + Initializes this list with a specific size. The list can be initialized only once. + + List element count + The list was already initialized + is negative or greater than 2^29-1 + + + + Initializes the list with given content. + + Item type + List content. Can be null in which case the list is simply not initialized. + Serialization action to transfer a particular item into the serializer state. + The list was already initialized + More than 2^29-1 items. + + + + ListDeserializer specialization for List(Int*), List(UInt*), List(Float*), and List(Enum). + + List element type + + + + One of ListOfBytes, ListOfShorts, ListOfInts, ListOfLongs. + + + + + Returns the element at given index. + + Element index + Element value + is out of range. + + + + Always throws because this specialization can never represent a List(bool). + + + + + Attempts to interpret this instance as List(UInt8). + + The desired representation + Element size is different from 1 byte. + + + + Attempts to interpret this instance as List(Int8). + + The desired representation + Element size is different from 1 byte. + + + + Attempts to interpret this instance as List(UInt16). + + The desired representation + Element size is different from 2 bytes. + + + + Attempts to interpret this instance as List(Int16). + + The desired representation + Element size is different from 2 bytes. + + + + Attempts to interpret this instance as List(UInt32). + + The desired representation + Element size is different from 4 bytes. + + + + Attempts to interpret this instance as List(Int32). + + The desired representation + Element size is different from 4 bytes. + + + + Attempts to interpret this instance as List(UInt64). + + The desired representation + Element size is different from 8 bytes. + + + + Attempts to interpret this instance as List(Int64). + + The desired representation + Element size is different from 8 bytes. + + + + Attempts to interpret this instance as List(Float32). + + The desired representation + Element size is different from 4 bytes. + + + + Attempts to interpret this instance as List(Float64). + + The desired representation + Element size is different from 8 bytes. + + + + Attempts to interpret this instance as List(U) whereby U is a struct, applying a selector function to each element. + + Selector function + The desired representation + + + + Attempts to interpret this instance as Text and returns the string representation. + + The decoded string + Element size is different from 1 byte. + + + + Implements . + + + + + + SerializerState specialization for List(Int*), List(UInt*), List(Float*), and List(Enum). + + List element type, must be primitive. Static constructor will throw if the type does not work. + + + + Gets or sets the value at given index. + + Element index + Element value + + + + This list's element count. + + + + + Initializes this list with a specific size. The list can be initialized only once. + + List element count + The list was already initialized + is negative or greater than 2^29-1 + + + + Initializes the list with given content. + + List content. Can be null in which case the list is simply not initialized. + The list was already initialized + More than 2^29-1 items. + + + + Implements . + + + + + + ListDeserializer specialization for List(T) when T is a known struct (i.e. a list of fixed-width composites). + + + + + Always returns ListKind.ListOfStructs. + + + + + Returns the deserializer state at given index. + + Element index + Element deserializer state + is out of range. + Traversal limit reached + + + + Converts this list to a different representation by applying an element selector function. + + Target type after applying the selector function + The selector function + The new list representation + + + + Implements . + + + + + SerializerState specialization for List(T) when T is a known struct (i.e. a list of fixed-width composites). + + SerializerState which represents the struct type + + + + Returns the struct serializer a given index. + + Element index + The struct serializer + + + + This list's element count. + + + + + Implementation of /> + + + + + + Initializes this list with a specific size. The list can be initialized only once. + + List element count + + + + Initializes the list with given content. + + Item type + List content. Can be null in which case the list is simply not initialized. + Serialization action to transfer a particular item into the serializer state. + The list was already initialized + More than 2^29-1 items. + + + + SerializerState specialization for List(Text) + + + + + Gets or sets the text at given index. Once an element is set, it cannot be overwritten. + + Element index + List is not initialized + is out of range. + UTF-8 encoding exceeds 2^29-2 bytes + + + + This list's element count. + + + + + Implementation of /> + + + + + Initializes this list with a specific size. The list can be initialized only once. + + List element count + The list was already initialized + is negative or greater than 2^29-1 + + + + Initializes the list with given content. + + List content. Can be null in which case the list is simply not initialized. + The list was already initialized + More than 2^29-1 items, or the UTF-8 encoding of an individual string requires more than 2^29-2 bytes. + + + + Runtime logging features rely on + + + + + Gets or sets the logger factory which will be used by this assembly. + + + + + Creates a new ILogger instance, using the LoggerFactory of this class. + + The type using the logger + The logger instance + + + + Entry point for building Cap'n Proto messages. + + + + + Constructs an instance using a custom segment allocator and reserves space for the root pointer. + + Segment allocator implementation type + + + + Constructs an instance using the default segment allocator and reserves space for the root pointer. + + Default segment size, + + + + Creates a new object inside the message. + + Serializer state specialization + Serializer state instance representing the new object + + + + Gets or sets the root object. The root object must be set exactly once per message. + Setting it manually is only required (and allowed) when it was created with . + + + + + Creates an object and sets it as root object. + + Serializer state specialization + Serializer state instance representing the new object + + + + Returns the wire representation of the built message. + + + + + Initializes the capability table for using the message builder in RPC context. + + + + + Returns this message builder's segment allocator. + + + + + The different kinds of Cap'n Proto objects. + Despite this is a [Flags] enum, it does not make sense to mutually combine literals. + + + + + The null object, obtained by decoding a null pointer. + + + + + A struct + + + + + A capability + + + + + A List(void) + + + + + A list of bits + + + + + A list of octets + + + + + A list of 16 bit words + + + + + A list of 32 bit words + + + + + A list of 64 bits words + + + + + A list of pointers + + + + + A list of fixed-width composites + + + + + A value. This kind of object does not exist on the wire and is not specified by Capnp. + It is an internal helper to represent lists of primitive values as lists of structs. + + + + + Provides extension methods for + + + + + LINQ-like "Select" operator for , with the addition that the resulting elements are accessible by index. + The operator implements lazy semantics, which means that the selector function results are not cached./> + + Source element type + Target element type + Source list + Selector function + A read-only list in which each element corresponds to the source element after applying the selector function + or is null. + + + + Applies a selector function to each list element and stores the result in a new list. + As opposed to the source is evaluated immediately + and the result is cached. + + Source element type + Target element type + Source list + Selector function + A read-only list in which each element corresponds to the source element after applying the selector function + or is null. + + + + Provides deep-copy functionality to re-serialize an existing deserializer state into another serializer state. + + + + + Performs a deep copy of an existing deserializer state into another serializer state. + This implementation does not analyze the source object graph and therefore cannot detect multiple references to the same object. + Such cases will result in object duplication. + + source state + target state + is null. + Target state was already set to a different object type than the source state. + Security violation due to amplification attack or stack overflow DoS attack, + or illegal pointer detected during deserialization. + + + + Helper struct to support tail calls + + + + + Wraps a SerializerState + + object to wrap + + + + Wraps a PendingQuestion + + object to wrap + + + + SerializerState, if applicable + + + + + PendingQuestion, if applicable + + + + + Generic Proxy implementation which exposes the (usually protected) Call method. + + + + + Wraps a capability implementation in a Proxy. + + Capability implementation + Proxy + is null. + No found on implemented interface(s). + Mismatch between generic type arguments (if capability interface is generic). + Mismatch between generic type arguments (if capability interface is generic). + Problem with instatiating the Skeleton (constructor threw exception). + Caller does not have permission to invoke the Skeleton constructor. + Problem with building the Skeleton type, or problem with loading some dependent class. + + + + Constructs an unbound instance. + + + + + Constructs an instance and binds it to the given low-level capability. + + low-level capability + + + + Requests a method call. + + Target interface ID + Target method ID + Method arguments + Whether it is a tail call + Answer promise + + + + Provides functionality to construct Proxy and Skeleton instances from capability interfaces and objects implementing capability interfaces. + A capability interface is any .NET interface which is annotated with and . + There are some intricacies to consider that you usually don't need to care about, since all that stuff will be generated. + + + + + Creates a Skeleton for a given interface implementation. + + Interface implementation. Must implement at least one interface which is annotated with a . + The Skeleton + is null. + No found on implemented interface(s). + Mismatch between generic type arguments (if capability interface is generic). + Mismatch between generic type arguments (if capability interface is generic). + Problem with instatiating the Skeleton (constructor threw exception). + Caller does not have permission to invoke the Skeleton constructor. + Problem with building the Skeleton type, or problem with loading some dependent class. + + + + Validates that a given type qualifies as cpapbility interface, throws on failure. + + type to check + is null. + Given typ did not qualify as capability interface. + Message and probably InnterException give more details. + + + + Checkes whether a given type qualifies as cpapbility interface./> on failure. + + type to check + true when is a capability interface + is null. + + + + Constructs a Proxy for given capability interface and wraps it around given low-level capability. + + Capability interface. Must be annotated with . + low-level capability + debugging aid + debugging aid + debugging aid + The Proxy instance which implements . + is null. + did not qualify as capability interface. + Mismatch between generic type arguments (if capability interface is generic). + Mismatch between generic type arguments (if capability interface is generic). + Problem with instatiating the Proxy (constructor threw exception). + Caller does not have permission to invoke the Proxy constructor. + Problem with building the Proxy type, or problem with loading some dependent class. + + + + Base class for a low-level capability at consumer side. It is created by the . An application does not directly interact with it + (which is intentionally impossible, since the invocation method is internal), but instead uses a -derived wrapper. + + + + + Request the RPC engine to release this capability from its import table, + which usually also means to remove it from the remote peer's export table. + + + + + A uni-directional endpoint, used in conjunction with the . + + + + + Transmit the given Cap'n Proto message over this endpoint. + + + + + Close this endpoint. + + + + + A mono skeleton (as opposed to ) is a skeleton which implements one particular RPC interface. + + + + + Interface ID of this skeleton. + + + + + Provides support for promise pipelining. + + + + + Attaches a continuation to the given promise and registers the resulting task for pipelining. + + Task result type + The promise + The continuation + Task representing the future answer + or is null. + The pomise was already registered. + + + + Looks up the underlying promise which was previously registered for the given Task using MakePipelineAware. + + + The underlying promise + is null. + The task was not registered using MakePipelineAware. + + + + Returns a local "lazy" proxy for a given Task. + This is not real promise pipelining and will probably be removed. + + Capability interface type + The task + debugging aid + debugging aid + debugging aid + A proxy for the given task. + is null. + did not + quality as capability interface. + + + + Checks whether a given task belongs to a pending RPC and requests a tail call if applicable. + + Task result type + Task to request + Converts the task's result to a SerializerState + Tail-call aware task + + + + Overload for tuple-typed tasks + + + + + Overload for tuple-typed tasks + + + + + Overload for tuple-typed tasks + + + + + Overload for tuple-typed tasks + + + + + Overload for tuple-typed tasks + + + + + Overload for tuple-typed tasks + + + + + Low-level capability which as imported from a remote peer. + + + + + Will be thrown if a type did not qualify as capability interface. + In order to qualify the type must be properly annotated with a and . + See descriptions of these attributes for further details. + + + + + Constructs an instance. + + + + + Constructs an instance with message an inner exception. + + + + + A promised answer due to RPC. + + + Disposing the instance before the answer is available results in a best effort attempt to cancel + the ongoing call. + + + + + Task which will complete when the RPC returns, delivering its result struct. + + + + + Creates a low-level capability for promise pipelining. + + Path to the desired capability inside the result struct. + Pipelined low-level capability + + + + Low-level interface of a capability at provider side. + + + + + Calls an interface method of this capability. + + ID of interface to call + ID of method to call + Method arguments ("params struct") + Cancellation token, indicating when the call should cancelled. + A Task which will resolve to the call result ("result struct") + + + + A promised capability. + + + + + Will eventually give the resolved capability. + + + + + A path from an outer Cap'n Proto struct to an inner (probably deeply nested) struct member. + + + + + Path to the bootstrap capability (which is an empty path) + + + + + Deserializes a MemberAccessPath from Cap'n Proto representation. + + Cap'n Proto representation + The MemberAccessPath + + + + Constructs a path from qualifiers. + + List of member access elements + + + + Constructs a path from Cap'n Proto struct member offsets. + + Member offsets + + + + Base class of an individual member access. + + + This might appear a bit of overengineering, since the only specialization is the . + But there might be further specializations in the future, the most obvious one being an "ArrayElementAccess". + Now we already have a suitable design pattern, mainly to show the abstract concept behind a member access path. + + + + + Deserializes a MemberAccess instance from Cap'n Proto representation. + + Cap'n Proto representation + Deserialized instance + + + + Serializes this instance to a . + + Serialization target + + + + Evaluates the member access on a given struct instance. + + Input struct instance + Member value or object + + + + The one and only member access which is currently supported: Member of a struct. + + + + + Constructs an instance for given struct member offset. + + The Cap'n Proto struct member offset + + + + The Cap'n Proto struct member offset + + + + + Serializes this instance to a . + + Serialization target + + + + Evaluates the member access on a given struct instance. + + Input struct instance + Member value or object + + + + The access path is a composition of individual member accesses. + + + + + Serializes this path th a . + + The serialization target + + + + Evaluates the path on a given object. + + The object (usually "params struct") on which to evaluate this path. + Resulting low-level capability + Evaluation of this path did not give a capability + + + + A promised answer due to RPC. + + + Disposing the instance before the answer is available results in a best effort attempt to cancel + the ongoing call. + + + + + Question lifetime management state + + + + + The question has not yet been sent. + + + + + Tail call flag + + + + + The question has been sent. + + + + + The question has been answered. + + + + + A 'finish' request was sent to the peer, indicating that no further requests will refer + to this question. + + + + + Question object was disposed. + + + + + Question object was finalized by GC. + This flag should only be observable when debugging the finalizer itself. + + + + + Eventually returns the server answer + + + + + Refer to a (possibly nested) member of this question's (possibly future) result and return + it as a capability. + + Access path + Low-level capability + The referenced member does not exist or does not resolve to a capability pointer. + + + + Finalizer + + + + + Implements . + + + + + Combines multiple skeletons to represent objects which implement multiple interfaces. + + + + + Adds a skeleton to this instance. + + Interface ID + Skeleton to add + is null. + A skeleton with was already added. + + + + Calls an interface method of this capability. + + ID of interface to call + ID of method to call + Method arguments ("params struct") + Cancellation token, indicating when the call should cancelled. + A Task which will resolve to the call result + + + + Dispose pattern implementation + + + + + Application-level wrapper for consumer-side capabilities. + The code generator will produce a Proxy specialization for each capability interface. + + + + + Will eventually give the resolved capability, if this is a promised capability. + + + + + Underlying low-level capability + + + + + Whether is this a broken capability. + + + + + Calls a method of this capability. + + Interface ID to call + Method ID to call + Method arguments ("param struct") + Whether it is a tail call + For cancelling an ongoing method call + An answer promise + This instance was disposed, or transport-layer stream was disposed. + Capability is broken. + An I/O error occurs. + + + + Constructs a null instance. + + + + + Dispose pattern implementation + + + + + Finalizer + + + + + Dispose pattern implementation + + + + + Casts this Proxy to a different capability interface. + + Desired capability interface + Whether to Dispose() this Proxy instance + Proxy for desired capability interface + did not qualify as capability interface. + This capability is broken, or mismatch between generic type arguments (if capability interface is generic). + Mismatch between generic type arguments (if capability interface is generic). + Problem with instatiating the Proxy (constructor threw exception). + Caller does not have permission to invoke the Proxy constructor. + Problem with building the Proxy type, or problem with loading some dependent class. + + + + Annotates a capability interface with its Proxy implementation. + + + + + Constructs this attribute. + + Proxy type. This must be a class which inherits from and + exposes a public parameterless constructor. Moreover, it must have same amount of generic type + parameters like the annotated interface, with identical generic constraints. + is null. + + + + The Proxy type. + + + + + Part of the Dispose pattern implementation. + + + + + Implements the Cap'n Proto RPC protocol. + + + + + Gets or sets the bootstrap capability. + + + + + Thrown when an RPC-related error condition occurs. + + + + + Constructs an instance. + + + + + Constructs an instance with message and inner exception. + + + + + A skeleton is a wrapper around a capability interface implementation which adapts it in the way it is + expected by the . + + + + + Claims ownership on the given capability, preventing its automatic disposal. + + Capability interface + Capability implementation + A disposable object. Calling Dispose() on the returned instance relinquishes ownership again. + + + + Calls an interface method of this capability. + + ID of interface to call + ID of method to call + Method arguments ("params struct") + Cancellation token, indicating when the call should cancelled. + A Task which will resolve to the call result + + + + Dispose pattern implementation + + + + + Finalizer + + + + + Skeleton for a specific capability interface. + + Capability interface + + + + Constructs an instance. + + + + + Populates this skeleton's method table. The method table maps method IDs (which are consecutively numbered from 0 + onwards) to the underlying capability's method implementations. + + The method table. Index is method ID. + + + + Gets the underlying capability implementation. + + + + + Gets the ID of the implemented interface. + + + + + Calls an interface method of this capability. + + ID of interface to call + ID of method to call + Method arguments ("params struct") + Cancellation token, indicating when the call should cancelled. + A Task which will resolve to the call result + This Skeleton was disposed + + + + Dispose pattern implementation + + + + + Annotates a capability interface with its Skeleton implementation. + + + + + Constructs this attribute. + + Skeleton type. This must be a class which inherits from and + exposes a public parameterless constructor. Moreover, it must have same amount of generic type + parameters like the annotated interface, with identical generic constraints. + is null. + + + + Gets the skeleton type. + + + + + TCP-based RPC implementation which will establish a connection to a TCP server implementing + the Cap'n Proto RPC protocol. + + + + + Gets a Task which completes when TCP is connected. + + + + + Constructs an instance and attempts to connect it to given host. + + The DNS name of the remote RPC host + The port number of the remote RPC host + is null. + is not between System.Net.IPEndPoint.MinPort and System.Net.IPEndPoint.MaxPort. + An error occurred when accessing the socket. + + + + Returns the remote bootstrap capability. + + Bootstrap capability interface + A proxy for the bootstrap capability + + + + Dispose pattern implementation + + + + + Gets the number of RPC protocol messages sent by this client so far. + + + + + Gets the number of RPC protocol messages received by this client so far. + + + + + Gets the remote port number which this client is connected to, + or null if the connection is not yet established. + + + + + Whether the I/O thread is currently running + + + + + Whether the I/O thread is waiting for data to receive + + + + + Cap'n Proto RPC TCP server. + + + + + Models an incoming connection. + + + + + Server-side port + + + + + Receive message counter + + + + + Sent message counter + + + + + Whether the RPC engine is currently computing. + + + + + Whether the connection is idle, waiting for data to receive. + + + + + Gets the number of currently active inbound TCP connections. + + + + + Stops accepting incoming attempts and closes all existing connections. + + + + + Constructs an instance. + + An System.Net.IPAddress that represents the local IP address. + The port on which to listen for incoming connection attempts. + is null. + is not between System.Net.IPEndPoint.MinPort and System.Net.IPEndPoint.MaxPort. + + + + Whether the thread which is responsible for acception incoming attempts is still alive. + The thread will die upon disposal, but also in case of a socket error condition. + Errors which occur on a particular connection will just close that connection and won't interfere + with the acceptor thread. + + + + + Sets the bootstrap capability. It must be an object which implements a valid capability interface + (). + + + + + Gets a snapshot of currently active connections. + + + + + Provides the security bounds for defeating amplification and stack overflow DoS attacks. + See https://capnproto.org/encoding.html#security-considerations for details. + + + + + The traversal limit, see https://capnproto.org/encoding.html#amplification-attack + + + + + The recursion limit, see https://capnproto.org/encoding.html#stack-overflow-dos-attack + + + + + The segment allocator default implementation. + + + + + Constructs an instance. + + Default size (in words) of a newly allocated segment. If a single allocation requires + a bigger size, a bigger dedicated segment will be allocated. On the wire, segments will be truncated to their actual + occupancies. + + + + The list of currently allocated segments, each one truncated to its actual occupancy. + + + + + Allocates memory. + + Number of words to allocate + Preferred segment index. If enough space is available, + memory will be allocated inside that segment. Otherwise, a different segment will be chosen, or + a new one will be allocated, or allocation will fail (depending on ). + The allocated memory slice in case of success (default(SegmentSlice) otherwise) + Whether using the preferred segment is mandatory. If it is and there is not + enough space available, allocation will fail. + Whether allocation was successful. + + + + Helper struct to represent the tuple (segment index, offset) + + + + + Segment index + + + + + Word offset within segment + + + + + Provides extensions to the and interfaces for type-safe reading and writing. + + + + + Reads a boolean field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes a boolean field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Reads a byte field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes a byte field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Reads a signed byte field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes a signed byte field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Reads a ushort field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes a ushort field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Reads a short field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes a short field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Reads a uint field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes a uint field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Performs a "reinterpret cast" of the struct's data section and returns a reference to a single element of the cast result. + + The cast target type. Must be a primitive type which qualifies for ()]]> + "this" instance + Index within the cast result, conceptually into U[] + A reference to the data element + + + + Reads an int field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes an int field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Reads a ulong field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes a ulong field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Reads a long field. + + Type implementing + "this" instance + Start bit + Field default value (will be XORed with the result) + The read value + + + + Writes a long field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (will be XORed with the value to write) + + + + Reads a float field. + + Type implementing + "this" instance + Start bit + Field default value (raw bits will be XORed with the result) + The read value + + + + Writes a float field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (raw bits will be XORed with the value to write) + + + + Reads a double field. + + Type implementing + "this" instance + Start bit + Field default value (raw bits will be XORed with the result) + The read value + + + + Writes a double field. + + Type implementing + "this" instance + Start bit + Value to write + Field default value (raw bits will be XORed with the value to write) + + + + Implements the heart of serialization. Exposes all functionality to encode serialized data. + Although it is public, you should not use it directly. Instead, use the reader, writer, and domain class adapters which are produced + by the code generator. Particularly, those writer classes are actually specializations of SerializerState, adding convenience methods + for accessing the struct's fields. + + + + + Constructs a SerializerState instance for use in RPC context. + This particularly means that the capability table will be initialized. + + Type of state (must inherit from SerializerState) + root object state + + + + Constructs an unbound serializer state. + + + + + Constructs a serializer state which is bound to a particular message builder. + + message builder to bind + + + + Represents this state by a different serializer state specialization. This is similar to a type-cast: The underlying object remains the same, + but the specialization adds a particular "view" on that data. + + target serializer state type + serializer state instance + The target serializer state is incompatible to this instance, because the instances do not agree on the + kind of underlying object (e.g. struct with particular data/pointer section size, list of something) + + + + Whether storage space for the underlying object was already allocated. Note that allocation happens + lazily, i.e. constructing a SerializerState and binding it to a MessageBuilder does NOT yet result in allocation. + + + + + Given this state describes a struct and is allocated, returns the struct's data section. + + + + + Returns the allocated memory slice (given this state already is allocated). Note that this definition is somewhat + non-symmetric to DeserializerState.RawData. Never mind: You should not use it directly, anyway. + + + + + Allocates storage for the underlying object. Does nothing if it is already allocated. From the point the object is allocated, its type cannot by changed + anymore (e.g. changing from struct to list, or modifying the struct's section sizes). + + + + + Links a sub-item (struct field or list element) of this state to another state. Usually, this operation is not necessary, since objects are constructed top-down. + However, there might be some advanced scenarios where you want to reference the same object twice (also interesting for designing amplification attacks). + The Cap'n Proto serialization intrinsically supports this, since messages are object graphs, not trees. + + If this state describes a struct: Index into this struct's pointer table. + If this state describes a list of pointers: List element index. + state to be linked + Whether to deep copy the target state if it belongs to a different message builder than this state. + is null + out of range + + This state does neither describe a struct, nor a list of pointers + Another state is already linked to the specified position (sorry, no overwrite allowed) + This state and belong to different message builder, and is false + + + + + + Links a sub-item (struct field or list element) of this state to a capability. + + If this state describes a struct: Index into this struct's pointer table. + If this state describes a list of pointers: List element index. + capability index inside the capability table + + This state does neither describe a struct, nor a list of pointers + Another state is already linked to the specified position (sorry, no overwrite allowed) + + + + + Determines the underlying object to be a struct. + + Desired size of the struct's data section, in words + Desired size of the struct's pointer section, in words + The object type was already set to something different + + + + Determines the underlying object to be a list of (primitive) values. + + Element size in bits, must be 0 (void), 1 (bool), 8, 16, 32, or 64 + Desired element count + The object type was already set to something different + outside allowed range, + negative or exceeding 2^29-1 + + + + Determines the underlying object to be a list of pointers. + + Desired element count + The object type was already set to something different + negative or exceeding 2^29-1 + + + + Determines the underlying object to be a list of structs (fixed-width compound list). + + Desired element count + Desired size of each struct's data section, in words + Desired size of each struct's pointer section, in words + The object type was already set to something different + negative, or total word count would exceed 2^29-1 + + + + Determines the underlying object to be a list of bytes and encodes the given text. + + text to encode + is null + Trying to obtain the UTF-8 encoding might throw this exception. + The object type was already set to something different + UTF-8 encoding exceeds 2^29-2 bytes + + + + Writes data (up to 64 bits) into the underlying struct's data section. + The write operation must be aligned to fit within a single word. + + Start bit relative to the struct's data section, little endian + Number of bits to write + Data bits to write + The object was not determined to be a struct + The data slice specified by and + is not completely within the struct's data section, misaligned, exceeds one word, or is negative + + + + Reads data (up to 64 bits) from the underlying struct's data section. + The write operation must be aligned to fit within a single word. + + Start bit relative to the struct's data section, little endian + Number of bits to read + Data bits which were read + The object was not determined to be a struct + The data slice specified by and + is not completely within the struct's data section, misaligned, exceeds one word, or is negative + + + + Constructs a new object at a struct field or list element, or returns the serializer state for an existing object. + + Target state type + If the underlying object is a struct: index into the struct's pointer section. + If the underlying object is a list of pointers: Element index + Bound serializer state instance + + The underlying object was not determined to be a struct or list of pointers. + Object at given position was already built and is not compatible with the desired target serializer type. + + is out of bounds. + + + + Returns an existing serializer state for a struct field or list element, or null if no such object exists. + + Target state type + If the underlying object is a struct: index into the struct's pointer section. + If the underlying object is a list of pointers: Element index + Bound serializer state instance + + The underlying object was not determined to be a struct or list of pointers. + Object at given position is not compatible with the desired target serializer type. + + is out of bounds. + + + + Convenience method for ]]> + + If the underlying object is a struct: index into the struct's pointer section. + If the underlying object is a list of pointers: Element index + Bound serializer state instance + + The underlying object was not determined to be a struct or list of pointers. + Object at given position was already built and is not compatible with the desired target serializer type. + + is out of bounds. + + + + Convenience method for ]]> + + If the underlying object is a struct: index into the struct's pointer section. + If the underlying object is a list of pointers: Element index + Bound serializer state instance + + The underlying object was not determined to be a struct or list of pointers. + Object at given position is not compatible with the desired target serializer type. + + is out of bounds. + + + + Reads text from a struct field or list element. + + If the underlying object is a struct: index into the struct's pointer section. + If the underlying object is a list of pointers: Element index + String to return in case of null + The decoded text + + + + Encodes text into a struct field or list element. + + If the underlying object is a struct: index into the struct's pointer section. + If the underlying object is a list of pointers: Element index + Text to encode + is null + + The underlying object was not determined to be a struct or list of pointers. + Object at given position was already set. + + is out of bounds. + + + + Encodes text into a struct field or list element, with fallback to a default text. + + If the underlying object is a struct: index into the struct's pointer section. + If the underlying object is a list of pointers: Element index + Text to encode + Default text of > is null + Both and are null + + The underlying object was not determined to be a struct or list of pointers. + Object at given position was already set. + + is out of bounds. + + + + Returns a state which represents a fixed-width composite list element. + + Element index + Bound serializer state + Underlying object was not determined to be a fixed-width composite list. + is out of bounds. + + + + Returns a state which represents a fixed-width composite list element. + + Target serializer state type + + Bound serializer state + Underlying object was not determined to be a fixed-width composite list. + is out of bounds. + + + + Sets an element of a list of bits. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of bits. + is out of bounds. + + + + Sets the list-of-bits' content. + + Content to set + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of bits. + is null. + The given element count does not match the underlying list's element count. + + + + Sets an element of a list of bytes. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of bytes. + is out of bounds. + + + + Returns the content of a list of bytes. + + The list bytes + The underlying object was not set to a list of bytes. + + + + Decodes a list of bytes as text. + + The decoded text. + The underlying object was not set to a list of bytes. + Might theoretically be thrown during decoding. + + + + Sets an element of a list of (signed) bytes. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of bytes. + is out of bounds. + + + + Sets an element of a list of 16 bit words. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of 16 bit words. + is out of bounds. + + + + Sets an element of a list of 16 bit words. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of 16 bit words. + is out of bounds. + + + + Sets an element of a list of 32 bit words. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of 32 bit words. + is out of bounds. + + + + Sets an element of a list of 32 bit words. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of 32 bit words. + is out of bounds. + + + + Sets an element of a list of 32 bit words. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of 32 bit words. + is out of bounds. + + + + Sets an element of a list of 64 bit words. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of 64 bit words. + is out of bounds. + + + + Sets an element of a list of 64 bit words. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of 64 bit words. + is out of bounds. + + + + Sets an element of a list of 64 bit words. + + Element index + Element value + Element default value (serialized value will be XORed with the default value) + The underlying object was not set to a list of 64 bit words. + is out of bounds. + + + + Adds an entry to the capability table if the provided capability does not yet exist. + + The low-level capability object to provide. + Index of the given capability in the capability table + The underlying message builder was not configured for capability table support. + + + + Adds an entry to the capability table if the provided capability does not yet exist. + + The capability to provide, in terms of its skeleton. + Index of the given capability in the capability table + The underlying message builder was not configured for capability table support. + + + + Adds an entry to the capability table if the provided capability does not yet exist. + + The capability, in one of the following forms: + Low-level capability object (Rpc.ConsumedCapability) + Proxy object (Rpc.Proxy) + Skeleton object (Rpc.Skeleton) + Capability interface implementation + + Index of the given capability in the capability table + The underlying message builder was not configured for capability table support. + + + + Links a sub-item (struct field or list element) of this state to another object. + In contrast to , this method also accepts deserializer states, domain objects, capabilites, and lists thereof. + If necessary, it will perform a deep copy. + + If this state describes a struct: Index into this struct's pointer table. + If this state describes a list of pointers: List element index. + Object to be linked. Must be one of the following: + Another + A (will always deep copy) + An object implementing + A low-level capability object () + A proxy object () + A skeleton object () + A capability interface implementation + A of one of the things listed here. + + is out of range. + + This state does neither describe a struct, nor a list of pointers + Another state is already linked to the specified position (sorry, no overwrite allowed) + + + + + Reads a struct field as capability and returns a proxy to that capability. + + Desired capability interface + Index into this struct's pointer table. + The proxy instance + is out of range. + The desired interface does not qualify as capability interface () + This state does not represent a struct. + + + + Reads a struct field as capability and returns a bare (generic) proxy to that capability. + + Index into this struct's pointer table. + The proxy instance + is out of range. + This state does not represent a struct. + + + + This method exists until NET Standard 2.1 is released + + + + + + + + + + + This method exists until NET Standard 2.1 is released + + + + + + + + + + + This method exists until NET Standard 2.1 is released + + + + + + + Represents a Cap'n Proto message. Actually a lightweight wrapper struct around a read-only list of memory segments. + + + + + The message segments + + + + + Constructs a message from a list of segments. + + + + + Pointer tag, see https://capnproto.org/encoding.html/> + + + + + Struct pointer + + + + + List pointer + + + + + Far pointer + + + + + Other (capability) pointer + + + + + Lightweight wrapper struct around a Cap'n Proto pointer. Useful for both encoding and decoding pointers. + + + + + Constructs this struct from pointer raw data + + + + + Interprets any ulong value as Cap'n Proto pointer + + + + + Extracts the wire data from the pointer. + + + + + Pointer tag "A" + + + + + Returns true iff this is a null pointer. + + + + + The Offset (field "B") for struct and list pointers. + + Thrown by setter if encoded value would require more than 30 bits + + + + Returns the landing pad offset (field "C") for inter-segment pointers. + + + + + Returns the size of the struct's data section (field "C"), in words, for struct pointers. + + + + + Returns the size of the struct's pointer section (field "D"), in words, for struct pointers. + + + + + Convenience getter which returns the sum of the struct's pointer and data section sizes. + + + + + Begins encoding a struct pointer. + + the size of the struct's data section, in words + the size of the struct's pointer section, in words + + + + Returns the list "size" (field "C") for list pointers. + + + + + Gets or sets the element count if this pointer represents a list of fixed-width composite values. + + negative value, or encoded value would require more than 30 bits + + + + Returns the element count if this pointer represents a list of anything, except fixed-width composite values. + + + + + Begins encoding a list pointer + + element "size" (field "C") + element count + element count would require more than 29 bits + + + + Returns the target segment index (field "D") for inter-segment pointers. + + + + + Whether the landing pad is two words (field "B") for inter-segment pointers. + + + + + Encodes an inter-segment pointer. + + target segment index + landing pad offset + whether the landing pad is two words + negative landing pad offset, or encoding would require more than 29 bits + + + + Returns the sub-kind of pointer (field "B") if this is an "other" pointer. + Currently, only 0 is specified, which is a capability pointer. + + + + + Returns the capability index (field "C") if this is a capability pointer. + + + + + Encodes a capability pointer. + + capability index + + + diff --git a/Capnp.Net.Runtime/Capnp.Net.Runtime.csproj b/Capnp.Net.Runtime/Capnp.Net.Runtime.csproj index 3520379..735ba47 100644 --- a/Capnp.Net.Runtime/Capnp.Net.Runtime.csproj +++ b/Capnp.Net.Runtime/Capnp.Net.Runtime.csproj @@ -1,15 +1,33 @@ - + - netcoreapp2.1 + netstandard2.0;netcoreapp2.1 Capnp 7.2 + Capnp.Net.Runtime + Capnp.Net.Runtime + true + Christian Köllner and contributors + A Cap'n Proto implementation for .NET Standard & Core + capnproto-dotnetcore + Christian Köllner and contributors + + https://github.com/c80k/capnproto-dotnetcore + https://github.com/c80k/capnproto-dotnetcore + MIT + Git + capnp "Cap'n Proto" RPC serialization cerealization + 1.0.0 - + TRACE + + F:\Repos\capnproto-dotnetcore\Capnp.Net.Runtime\Capnp.Net.Runtime.Std20.xml + + diff --git a/Capnp.Net.Runtime/DeserializationException.cs b/Capnp.Net.Runtime/DeserializationException.cs index 9db5b60..a9dfcaa 100644 --- a/Capnp.Net.Runtime/DeserializationException.cs +++ b/Capnp.Net.Runtime/DeserializationException.cs @@ -7,10 +7,16 @@ namespace Capnp /// public class DeserializationException : Exception { + /// + /// Constructs an instance + /// public DeserializationException(string message) : base(message) { } + /// + /// Constructs an instance with message and inner exception + /// public DeserializationException(string message, Exception innerException): base(message, innerException) { diff --git a/Capnp.Net.Runtime/DeserializerState.cs b/Capnp.Net.Runtime/DeserializerState.cs index f32ab86..5fed754 100644 --- a/Capnp.Net.Runtime/DeserializerState.cs +++ b/Capnp.Net.Runtime/DeserializerState.cs @@ -637,6 +637,9 @@ namespace Capnp /// /// Capability interface /// index within this struct's pointer table + /// debugging aid + /// debugging aid + /// debugging aid /// capability instance or null if pointer was null /// negative index /// state does not represent a struct, invalid pointer, diff --git a/Capnp.Net.Runtime/DynamicSerializerState.cs b/Capnp.Net.Runtime/DynamicSerializerState.cs index 2ac3bc8..793c8f9 100644 --- a/Capnp.Net.Runtime/DynamicSerializerState.cs +++ b/Capnp.Net.Runtime/DynamicSerializerState.cs @@ -61,8 +61,8 @@ namespace Capnp /// is null /// out of range /// - /// This state does neither describe a struct, nor a list of pointers - /// Another state is already linked to the specified position (sorry, no overwrite allowed) + /// This state does neither describe a struct, nor a list of pointers + /// Another state is already linked to the specified position (sorry, no overwrite allowed) /// This state and belong to different message builder, and is false /// public new void Link(int slot, SerializerState target, bool allowCopy = true) => base.Link(slot, target, allowCopy); @@ -74,7 +74,7 @@ namespace Capnp /// If this state describes a list of pointers: List element index. /// capability index inside the capability table /// - /// This state does neither describe a struct, nor a list of pointers + /// This state does neither describe a struct, nor a list of pointers /// Another state is already linked to the specified position (sorry, no overwrite allowed) /// public new void LinkToCapability(int slot, uint capabilityIndex) => base.LinkToCapability(slot, capabilityIndex); @@ -123,24 +123,25 @@ namespace Capnp /// An instance implementing /// null /// A - /// A - /// A - /// A - /// A - /// A - /// A - /// A - /// A - /// A - /// A + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> + /// A ]]> /// Another /// Another /// Low-level capability object () /// Proxy object () /// Skeleton object () /// Capability interface implementation - /// A whereby each list item is one of the things listed here. + /// A ]]> whereby each list item is one of the things listed here. /// /// public void SetObject(object obj) diff --git a/Capnp.Net.Runtime/EmptyListDeserializer.cs b/Capnp.Net.Runtime/EmptyListDeserializer.cs index e843204..ac7be4f 100644 --- a/Capnp.Net.Runtime/EmptyListDeserializer.cs +++ b/Capnp.Net.Runtime/EmptyListDeserializer.cs @@ -21,47 +21,47 @@ namespace Capnp public override IReadOnlyList Cast(Func cons) => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>/>. /// public override IReadOnlyList CastBool() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>/>. /// public override IReadOnlyList CastByte() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>/>. /// public override IReadOnlyList CastDouble() => new EmptyList(); /// - /// Returns an empty + /// Returns an empty ]]>. /// public override IReadOnlyList CastFloat() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>. /// public override IReadOnlyList CastInt() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>. /// public override IReadOnlyList CastList() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>/>. /// public override IReadOnlyList CastLong() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>. /// public override IReadOnlyList CastSByte() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>. /// public override IReadOnlyList CastShort() => new EmptyList(); @@ -71,17 +71,17 @@ namespace Capnp public override string CastText() => string.Empty; /// - /// Returns an empty . + /// Returns an empty ]]>. /// public override IReadOnlyList CastUInt() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>. /// public override IReadOnlyList CastULong() => new EmptyList(); /// - /// Returns an empty . + /// Returns an empty ]]>. /// public override IReadOnlyList CastUShort() => new EmptyList(); } diff --git a/Capnp.Net.Runtime/FramePump.cs b/Capnp.Net.Runtime/FramePump.cs index 837648c..dcfc154 100644 --- a/Capnp.Net.Runtime/FramePump.cs +++ b/Capnp.Net.Runtime/FramePump.cs @@ -75,7 +75,7 @@ namespace Capnp if (frame.Segments.Count == 0) throw new ArgumentException("Expected at least one segment"); - + foreach (var segment in frame.Segments) { if (segment.Length == 0) @@ -99,8 +99,11 @@ namespace Capnp foreach (var segment in frame.Segments) { +#if NETSTANDARD2_0 + var bytes = MemoryMarshal.Cast(segment.Span).ToArray(); +#else var bytes = MemoryMarshal.Cast(segment.Span); - +#endif _writer.Write(bytes); } } @@ -123,7 +126,7 @@ namespace Capnp /// to be part of normal operation. It does pass exceptions which arise due to I/O errors or invalid data. /// /// The underlying stream does not support reading or is already closed. - /// Received invalid data. + /// Encountered Invalid Framing Data /// Received a message with too many or too big segments, probably dues to invalid data. /// An I/O error occurs. public void Run() @@ -135,55 +138,19 @@ namespace Capnp while (true) { IsWaitingForData = true; - - uint scountm = reader.ReadUInt32(); - int scount = checked((int)(scountm + 1)); - var buffers = new Memory[scount]; - - for (uint i = 0; i < scount; i++) - { - int size = checked((int)reader.ReadUInt32()); - - // This implementation will never send empty segments. - // Other implementations should not. An empty segment may also - // indicate and end-of-stream (stream closed) condition. - if (size == 0) - { - Logger.LogInformation("Received zero-sized segment, stopping interaction"); - return; - } - - buffers[i] = new Memory(new ulong[size]); - } - - if ((scount & 1) == 0) - { - // Padding - reader.ReadUInt32(); - } - - for (uint i = 0; i < scount; i++) - { - var buffer = MemoryMarshal.Cast(buffers[i].Span); - - int got = reader.Read(buffer); - - if (got != buffer.Length) - { - Logger.LogWarning("Received incomplete frame"); - - throw new EndOfStreamException("Expected more bytes according to framing header"); - } - } - + var frame = reader.ReadWireFrame(); IsWaitingForData = false; - - FrameReceived?.Invoke(new WireFrame(new ArraySegment>(buffers, 0, scount))); + FrameReceived?.Invoke(frame); } } } catch (EndOfStreamException) { + Logger.LogWarning("Encountered End of Stream"); + } + catch (InvalidDataException e) + { + Logger.LogWarning(e.Message); } catch (ObjectDisposedException) { diff --git a/Capnp.Net.Runtime/Framing.cs b/Capnp.Net.Runtime/Framing.cs index 657ffc1..e9707ce 100644 --- a/Capnp.Net.Runtime/Framing.cs +++ b/Capnp.Net.Runtime/Framing.cs @@ -21,39 +21,88 @@ namespace Capnp /// The end of the stream is reached. /// The stream is closed. /// An I/O error occurs. - /// Encountered invalid framing data. + /// Encountered invalid framing data, too many or too large segments /// Too many or too large segments, probably due to invalid framing data. public static WireFrame ReadSegments(Stream stream) { using (var reader = new BinaryReader(stream, Encoding.Default, true)) { - uint scountm = reader.ReadUInt32(); - uint scount = checked(scountm + 1); - var buffers = new Memory[scount]; + return reader.ReadWireFrame(); + } + } - for (uint i = 0; i < scount; i++) + /// + /// Deserializes the next Cap'n Proto message from given stream. + /// + /// The stream to read from + /// The message + public static WireFrame ReadWireFrame(this BinaryReader reader) + { + uint scount = reader.ReadUInt32(); + if (scount++ == uint.MaxValue) + { + throw new InvalidDataException("Encountered invalid framing data"); + } + + // Cannot have more segments than the traversal limit + if (scount >= SecurityOptions.TraversalLimit) + { + throw new InvalidDataException("Too many segments. Probably invalid data. Try increasing the traversal limit."); + } + + var buffers = new Memory[scount]; + + for (uint i = 0; i < scount; i++) + { + uint size = reader.ReadUInt32(); + + if (size == 0) { - uint size = reader.ReadUInt32(); - buffers[i] = new Memory(new ulong[size]); + throw new EndOfStreamException("Stream closed"); } - if ((scount & 1) == 0) + if (size >= SecurityOptions.TraversalLimit) { - // Padding - reader.ReadUInt32(); + throw new InvalidDataException("Too large segment. Probably invalid data. Try increasing the traversal limit."); } - for (uint i = 0; i < scount; i++) + buffers[i] = new Memory(new ulong[size]); + } + + if ((scount & 1) == 0) + { + // Padding + reader.ReadUInt32(); + } + + FillBuffersFromFrames(buffers, scount, reader); + + return new WireFrame(buffers); + } + + static void FillBuffersFromFrames(Memory[] buffers, uint segmentCount, BinaryReader reader) + { + for (uint i = 0; i < segmentCount; i++) + { +#if NETSTANDARD2_0 + var buffer = MemoryMarshal.Cast(buffers[i].Span.ToArray()); + var tmpBuffer = reader.ReadBytes(buffer.Length); + + if (tmpBuffer.Length != buffer.Length) { - var buffer = MemoryMarshal.Cast(buffers[i].Span); - - if (reader.Read(buffer) != buffer.Length) - { - throw new EndOfStreamException("Expected more bytes according to framing header"); - } + throw new InvalidDataException("Expected more bytes according to framing header"); } - - return new WireFrame(buffers); + + // Fastest way to do this without /unsafe + for (int j = 0; j < buffers[i].Length; j++) + { + var value = BitConverter.ToUInt64(tmpBuffer, j*8); + buffers[i].Span[j] = value; + } +#else + var buffer = MemoryMarshal.Cast(buffers[i].Span); + reader.Read(buffer); +#endif } } } diff --git a/Capnp.Net.Runtime/ListDeserializer.cs b/Capnp.Net.Runtime/ListDeserializer.cs index 78f4105..cfe2acd 100644 --- a/Capnp.Net.Runtime/ListDeserializer.cs +++ b/Capnp.Net.Runtime/ListDeserializer.cs @@ -360,12 +360,12 @@ namespace Capnp return Cast(sd => sd.ReadDataUInt(0)); } - public virtual IReadOnlyList CastLong() /// /// Represents this list as List(Int64). /// /// The desired representation /// If this list cannot be represented in the desired manner. + public virtual IReadOnlyList CastLong() { return Cast(sd => sd.ReadDataLong(0)); } diff --git a/Capnp.Net.Runtime/ListOfBitsDeserializer.cs b/Capnp.Net.Runtime/ListOfBitsDeserializer.cs index 1cc4061..7415ffb 100644 --- a/Capnp.Net.Runtime/ListOfBitsDeserializer.cs +++ b/Capnp.Net.Runtime/ListOfBitsDeserializer.cs @@ -50,7 +50,7 @@ namespace Capnp } /// - /// Implements + /// Implements /// /// public IEnumerator GetEnumerator() diff --git a/Capnp.Net.Runtime/ListOfCapsDeserializer.cs b/Capnp.Net.Runtime/ListOfCapsDeserializer.cs index a1668c6..c80eff3 100644 --- a/Capnp.Net.Runtime/ListOfCapsDeserializer.cs +++ b/Capnp.Net.Runtime/ListOfCapsDeserializer.cs @@ -56,7 +56,7 @@ namespace Capnp } /// - /// Implements + /// Implements . /// /// public IEnumerator GetEnumerator() diff --git a/Capnp.Net.Runtime/ListOfCapsSerializer.cs b/Capnp.Net.Runtime/ListOfCapsSerializer.cs index b7207e9..960a8e3 100644 --- a/Capnp.Net.Runtime/ListOfCapsSerializer.cs +++ b/Capnp.Net.Runtime/ListOfCapsSerializer.cs @@ -95,7 +95,7 @@ namespace Capnp } /// - /// Implements + /// Implements . /// /// public IEnumerator GetEnumerator() diff --git a/Capnp.Net.Runtime/ListOfPrimitivesDeserializer.cs b/Capnp.Net.Runtime/ListOfPrimitivesDeserializer.cs index fc10145..2c9d887 100644 --- a/Capnp.Net.Runtime/ListOfPrimitivesDeserializer.cs +++ b/Capnp.Net.Runtime/ListOfPrimitivesDeserializer.cs @@ -208,7 +208,7 @@ namespace Capnp var utf8Bytes = PrimitiveCast().Data; if (utf8Bytes.Length == 0) return string.Empty; var utf8GytesNoZterm = utf8Bytes.Slice(0, utf8Bytes.Length - 1); - return Encoding.UTF8.GetString(utf8GytesNoZterm); + return Encoding.UTF8.GetString(utf8GytesNoZterm.ToArray()); } IEnumerable Enumerate() diff --git a/Capnp.Net.Runtime/ListOfStructsDeserializer.cs b/Capnp.Net.Runtime/ListOfStructsDeserializer.cs index 04f0bdd..0b42b07 100644 --- a/Capnp.Net.Runtime/ListOfStructsDeserializer.cs +++ b/Capnp.Net.Runtime/ListOfStructsDeserializer.cs @@ -66,7 +66,7 @@ namespace Capnp } /// - /// Implements + /// Implements . /// public IEnumerator GetEnumerator() { diff --git a/Capnp.Net.Runtime/PrimitiveCoder.cs b/Capnp.Net.Runtime/PrimitiveCoder.cs index ba03f80..3614f67 100644 --- a/Capnp.Net.Runtime/PrimitiveCoder.cs +++ b/Capnp.Net.Runtime/PrimitiveCoder.cs @@ -24,10 +24,10 @@ namespace Capnp Coder.Fn = (x, y) => x ^ y; Coder.Fn = (x, y) => { - int xi = BitConverter.SingleToInt32Bits(x); - int yi = BitConverter.SingleToInt32Bits(y); + int xi = x.ReplacementSingleToInt32Bits(); + int yi = y.ReplacementSingleToInt32Bits(); int zi = xi ^ yi; - return BitConverter.Int32BitsToSingle(zi); + return BitConverter.ToSingle(BitConverter.GetBytes(zi), 0); }; Coder.Fn = (x, y) => { diff --git a/Capnp.Net.Runtime/ReadOnlyListExtensions.cs b/Capnp.Net.Runtime/ReadOnlyListExtensions.cs index 9ff9097..656ec19 100644 --- a/Capnp.Net.Runtime/ReadOnlyListExtensions.cs +++ b/Capnp.Net.Runtime/ReadOnlyListExtensions.cs @@ -38,7 +38,7 @@ namespace Capnp } /// - /// LINQ-like "Select" operator for , with the addition that the resulting elements are accessible by index. /// The operator implements lazy semantics, which means that the selector function results are not cached./> /// /// Source element type diff --git a/Capnp.Net.Runtime/Rpc/AnswerOrCounterquestion.cs b/Capnp.Net.Runtime/Rpc/AnswerOrCounterquestion.cs index 0755b53..1cdd5d6 100644 --- a/Capnp.Net.Runtime/Rpc/AnswerOrCounterquestion.cs +++ b/Capnp.Net.Runtime/Rpc/AnswerOrCounterquestion.cs @@ -12,17 +12,32 @@ _obj = obj; } + /// + /// Wraps a SerializerState + /// + /// object to wrap public static implicit operator AnswerOrCounterquestion (SerializerState answer) { return new AnswerOrCounterquestion(answer); } + /// + /// Wraps a PendingQuestion + /// + /// object to wrap public static implicit operator AnswerOrCounterquestion (PendingQuestion counterquestion) { return new AnswerOrCounterquestion(counterquestion); } + /// + /// SerializerState, if applicable + /// public SerializerState Answer => _obj as SerializerState; + + /// + /// PendingQuestion, if applicable + /// public PendingQuestion Counterquestion => _obj as PendingQuestion; } } diff --git a/Capnp.Net.Runtime/Rpc/BareProxy.cs b/Capnp.Net.Runtime/Rpc/BareProxy.cs index 9739e5a..8f133bc 100644 --- a/Capnp.Net.Runtime/Rpc/BareProxy.cs +++ b/Capnp.Net.Runtime/Rpc/BareProxy.cs @@ -10,13 +10,13 @@ /// /// Capability implementation /// Proxy - /// is null. + /// is null. /// No found on implemented interface(s). - /// Mismatch between generic type arguments (if capability interface is generic). - /// Mismatch between generic type arguments (if capability interface is generic). + /// Mismatch between generic type arguments (if capability interface is generic). + /// Mismatch between generic type arguments (if capability interface is generic). /// Problem with instatiating the Skeleton (constructor threw exception). - /// Caller does not have permission to invoke the Skeleton constructor. - /// Problem with building the Skeleton type, or problem with loading some dependent class. + /// Caller does not have permission to invoke the Skeleton constructor. + /// Problem with building the Skeleton type, or problem with loading some dependent class. public static BareProxy FromImpl(object impl) { return new BareProxy(LocalCapability.Create(CapabilityReflection.CreateSkeleton(impl))); diff --git a/Capnp.Net.Runtime/Rpc/CapabilityReflection.cs b/Capnp.Net.Runtime/Rpc/CapabilityReflection.cs index 87f4441..98b7fe0 100644 --- a/Capnp.Net.Runtime/Rpc/CapabilityReflection.cs +++ b/Capnp.Net.Runtime/Rpc/CapabilityReflection.cs @@ -252,6 +252,9 @@ namespace Capnp.Rpc /// /// Capability interface. Must be annotated with . /// low-level capability + /// debugging aid + /// debugging aid + /// debugging aid /// The Proxy instance which implements . /// is null. /// did not qualify as capability interface. diff --git a/Capnp.Net.Runtime/Rpc/Impatient.cs b/Capnp.Net.Runtime/Rpc/Impatient.cs index c5b9e27..e49d8e0 100644 --- a/Capnp.Net.Runtime/Rpc/Impatient.cs +++ b/Capnp.Net.Runtime/Rpc/Impatient.cs @@ -81,6 +81,9 @@ namespace Capnp.Rpc /// /// Capability interface type /// The task + /// debugging aid + /// debugging aid + /// debugging aid /// A proxy for the given task. /// is null. /// did not @@ -101,6 +104,13 @@ namespace Capnp.Rpc set { _askingEndpoint.Value = value; } } + /// + /// Checks whether a given task belongs to a pending RPC and requests a tail call if applicable. + /// + /// Task result type + /// Task to request + /// Converts the task's result to a SerializerState + /// Tail-call aware task public static async Task MaybeTailCall(Task task, Func func) { if (TryGetAnswer(task) is PendingQuestion pendingQuestion && @@ -115,31 +125,49 @@ namespace Capnp.Rpc } } + /// + /// Overload for tuple-typed tasks + /// public static Task MaybeTailCall(Task<(T1, T2)> task, Func func) { return MaybeTailCall(task, (ValueTuple t) => func(t.Item1, t.Item2)); } + /// + /// Overload for tuple-typed tasks + /// public static Task MaybeTailCall(Task<(T1, T2, T3)> task, Func func) { return MaybeTailCall(task, (ValueTuple t) => func(t.Item1, t.Item2, t.Item3)); } + /// + /// Overload for tuple-typed tasks + /// public static Task MaybeTailCall(Task<(T1, T2, T3, T4)> task, Func func) { return MaybeTailCall(task, (ValueTuple t) => func(t.Item1, t.Item2, t.Item3, t.Item4)); } + /// + /// Overload for tuple-typed tasks + /// public static Task MaybeTailCall(Task<(T1, T2, T3, T4, T5)> task, Func func) { return MaybeTailCall(task, (ValueTuple t) => func(t.Item1, t.Item2, t.Item3, t.Item4, t.Item5)); } + /// + /// Overload for tuple-typed tasks + /// public static Task MaybeTailCall(Task<(T1, T2, T3, T4, T5, T6)> task, Func func) { return MaybeTailCall(task, (ValueTuple t) => func(t.Item1, t.Item2, t.Item3, t.Item4, t.Item5, t.Item6)); } + /// + /// Overload for tuple-typed tasks + /// public static Task MaybeTailCall(Task<(T1, T2, T3, T4, T5, T6, T7)> task, Func func) { return MaybeTailCall(task, (ValueTuple t) => func(t.Item1, t.Item2, t.Item3, t.Item4, t.Item5, t.Item6, t.Item7)); diff --git a/Capnp.Net.Runtime/Rpc/InvalidCapabilityInterfaceException.cs b/Capnp.Net.Runtime/Rpc/InvalidCapabilityInterfaceException.cs index 7df17ca..2ce9466 100644 --- a/Capnp.Net.Runtime/Rpc/InvalidCapabilityInterfaceException.cs +++ b/Capnp.Net.Runtime/Rpc/InvalidCapabilityInterfaceException.cs @@ -7,10 +7,16 @@ /// public class InvalidCapabilityInterfaceException : System.Exception { + /// + /// Constructs an instance. + /// public InvalidCapabilityInterfaceException(string message) : base(message) { } + /// + /// Constructs an instance with message an inner exception. + /// public InvalidCapabilityInterfaceException(string message, System.Exception innerException) : base(message, innerException) { } diff --git a/Capnp.Net.Runtime/Rpc/LazyCapability.cs b/Capnp.Net.Runtime/Rpc/LazyCapability.cs index b90c60a..607b4a6 100644 --- a/Capnp.Net.Runtime/Rpc/LazyCapability.cs +++ b/Capnp.Net.Runtime/Rpc/LazyCapability.cs @@ -52,7 +52,7 @@ namespace Capnp.Rpc internal override void Export(IRpcEndpoint endpoint, CapDescriptor.WRITER writer) { - if (WhenResolved.IsCompletedSuccessfully) + if (WhenResolved.ReplacementTaskIsCompletedSuccessfully()) { WhenResolved.Result.Export(endpoint, writer); } diff --git a/Capnp.Net.Runtime/Rpc/MemberAccessPath.cs b/Capnp.Net.Runtime/Rpc/MemberAccessPath.cs index 00ca7b5..7b887c8 100644 --- a/Capnp.Net.Runtime/Rpc/MemberAccessPath.cs +++ b/Capnp.Net.Runtime/Rpc/MemberAccessPath.cs @@ -9,8 +9,16 @@ namespace Capnp.Rpc /// public class MemberAccessPath { + /// + /// Path to the bootstrap capability (which is an empty path) + /// public static readonly MemberAccessPath BootstrapAccess = new MemberAccessPath(new List()); + /// + /// Deserializes a MemberAccessPath from Cap'n Proto representation. + /// + /// Cap'n Proto representation + /// The MemberAccessPath public static MemberAccessPath Deserialize(PromisedAnswer.READER promisedAnswer) { var ops = new MemberAccess[promisedAnswer.Transform.Count]; @@ -55,6 +63,11 @@ namespace Capnp.Rpc /// public abstract class MemberAccess { + /// + /// Deserializes a MemberAccess instance from Cap'n Proto representation. + /// + /// Cap'n Proto representation + /// Deserialized instance public static MemberAccess Deserialize(PromisedAnswer.Op.READER op) { switch (op.which) diff --git a/Capnp.Net.Runtime/Rpc/PendingQuestion.cs b/Capnp.Net.Runtime/Rpc/PendingQuestion.cs index 68623e8..af32001 100644 --- a/Capnp.Net.Runtime/Rpc/PendingQuestion.cs +++ b/Capnp.Net.Runtime/Rpc/PendingQuestion.cs @@ -15,15 +15,47 @@ namespace Capnp.Rpc /// public sealed class PendingQuestion: IPromisedAnswer { + /// + /// Question lifetime management state + /// [Flags] public enum State { + /// + /// The question has not yet been sent. + /// None = 0, + + /// + /// Tail call flag + /// TailCall = 1, + + /// + /// The question has been sent. + /// Sent = 2, + + /// + /// The question has been answered. + /// Returned = 4, + + /// + /// A 'finish' request was sent to the peer, indicating that no further requests will refer + /// to this question. + /// FinishRequested = 8, + + /// + /// Question object was disposed. + /// Disposed = 16, + + /// + /// Question object was finalized by GC. + /// This flag should only be observable when debugging the finalizer itself. + /// Finalized = 32 } @@ -59,7 +91,12 @@ namespace Capnp.Rpc internal object ReentrancyBlocker { get; } = new object(); internal uint QuestionId => _questionId; internal State StateFlags { get; private set; } + + /// + /// Eventually returns the server answer + /// public Task WhenReturned => _tcs.Task; + internal bool IsTailCall { get => StateFlags.HasFlag(State.TailCall); @@ -189,6 +226,13 @@ namespace Capnp.Rpc DeleteMyQuestion(); } + /// + /// Refer to a (possibly nested) member of this question's (possibly future) result and return + /// it as a capability. + /// + /// Access path + /// Low-level capability + /// The referenced member does not exist or does not resolve to a capability pointer. public ConsumedCapability Access(MemberAccessPath access) { lock (ReentrancyBlocker) @@ -296,11 +340,17 @@ namespace Capnp.Rpc ReleaseCaps(target, inParams); } + /// + /// Finalizer + /// ~PendingQuestion() { Dispose(false); } + /// + /// Implements . + /// public void Dispose() { Dispose(true); diff --git a/Capnp.Net.Runtime/Rpc/PromisedCapability.cs b/Capnp.Net.Runtime/Rpc/PromisedCapability.cs index 6a7ad73..7eefd0a 100644 --- a/Capnp.Net.Runtime/Rpc/PromisedCapability.cs +++ b/Capnp.Net.Runtime/Rpc/PromisedCapability.cs @@ -77,7 +77,8 @@ namespace Capnp.Rpc { lock (_reentrancyBlocker) { - if (_resolvedCap.Task.IsCompletedSuccessfully) + + if (_resolvedCap.Task.ReplacementTaskIsCompletedSuccessfully()) { _resolvedCap.Task.Result.Export(endpoint, writer); } diff --git a/Capnp.Net.Runtime/Rpc/Proxy.cs b/Capnp.Net.Runtime/Rpc/Proxy.cs index 9e4380c..bd341ef 100644 --- a/Capnp.Net.Runtime/Rpc/Proxy.cs +++ b/Capnp.Net.Runtime/Rpc/Proxy.cs @@ -35,6 +35,9 @@ namespace Capnp.Rpc } } + /// + /// Underlying low-level capability + /// protected internal ConsumedCapability ConsumedCap { get; private set; } /// @@ -68,7 +71,7 @@ namespace Capnp.Rpc /// An answer promise /// This instance was disposed, or transport-layer stream was disposed. /// Capability is broken. - /// An I/O error occurs. + /// An I/O error occurs. protected internal IPromisedAnswer Call(ulong interfaceId, ushort methodId, DynamicSerializerState args, bool tailCall, CancellationToken cancellationToken = default) { if (_disposedValue) @@ -87,6 +90,9 @@ namespace Capnp.Rpc return answer; } + /// + /// Constructs a null instance. + /// public Proxy() { } @@ -135,6 +141,9 @@ namespace Capnp.Rpc } } + /// + /// Finalizer + /// ~Proxy() { #if DebugFinalizers diff --git a/Capnp.Net.Runtime/Rpc/RpcEngine.cs b/Capnp.Net.Runtime/Rpc/RpcEngine.cs index 0cb05bc..2333454 100644 --- a/Capnp.Net.Runtime/Rpc/RpcEngine.cs +++ b/Capnp.Net.Runtime/Rpc/RpcEngine.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Diagnostics; +using System.Linq; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -97,7 +98,14 @@ namespace Capnp.Rpc { _exportTable.Clear(); _revExportTable.Clear(); - _questionTable.Clear(); + + foreach (var question in _questionTable.Values.ToList()) + { + question.OnException(new RpcException("RPC connection is broken. Task would never return.")); + } + + Debug.Assert(_questionTable.Count == 0); + _answerTable.Clear(); _pendingDisembargos.Clear(); } @@ -179,13 +187,7 @@ namespace Capnp.Rpc uint RandId() { - uint id = 0; - var idSpan = MemoryMarshal.CreateSpan(ref id, 1); - var idBytes = MemoryMarshal.Cast(idSpan); - - _random.NextBytes(idBytes); - - return id; + return unchecked((uint)_random.Next(int.MinValue, int.MaxValue)); } uint AllocateExport(Skeleton providedCapability, out bool first) @@ -237,7 +239,7 @@ namespace Capnp.Rpc lock (_reentrancyBlocker) { - while (!_questionTable.TryAdd(questionId, question)) + while (!_questionTable.ReplacementTryAdd(questionId, question)) { questionId = RandId(); var oldQuestion = question; @@ -277,7 +279,7 @@ namespace Capnp.Rpc { uint id = RandId(); - while (!_pendingDisembargos.TryAdd(id, tcs)) + while (!_pendingDisembargos.ReplacementTryAdd(id, tcs)) { id = RandId(); } @@ -323,7 +325,7 @@ namespace Capnp.Rpc bool added; lock (_reentrancyBlocker) { - added = _answerTable.TryAdd(req.QuestionId, pendingAnswer); + added = _answerTable.ReplacementTryAdd(req.QuestionId, pendingAnswer); } if (!added) @@ -382,7 +384,7 @@ namespace Capnp.Rpc bool added; lock (_reentrancyBlocker) { - added = _answerTable.TryAdd(req.QuestionId, pendingAnswer); + added = _answerTable.ReplacementTryAdd(req.QuestionId, pendingAnswer); } if (!added) @@ -876,7 +878,7 @@ namespace Capnp.Rpc lock (_reentrancyBlocker) { - exists = _pendingDisembargos.Remove(disembargo.Context.ReceiverLoopback, out tcs); + exists = _pendingDisembargos.ReplacementTryRemove(disembargo.Context.ReceiverLoopback, out tcs); } if (exists) @@ -950,7 +952,7 @@ namespace Capnp.Rpc lock (_reentrancyBlocker) { - exists = _answerTable.Remove(finish.QuestionId, out answer); + exists = _answerTable.ReplacementTryRemove(finish.QuestionId, out answer); } if (exists) @@ -988,7 +990,7 @@ namespace Capnp.Rpc if (rc.RefCount == 0) { _exportTable.Remove(id); - _revExportTable.Remove(rc.Cap, out uint _); + _revExportTable.ReplacementTryRemove(rc.Cap, out uint _); } } catch (System.Exception) diff --git a/Capnp.Net.Runtime/Rpc/RpcException.cs b/Capnp.Net.Runtime/Rpc/RpcException.cs index fdee0eb..9629cf9 100644 --- a/Capnp.Net.Runtime/Rpc/RpcException.cs +++ b/Capnp.Net.Runtime/Rpc/RpcException.cs @@ -5,10 +5,16 @@ /// public class RpcException : System.Exception { + /// + /// Constructs an instance. + /// public RpcException(string message) : base(message) { } + /// + /// Constructs an instance with message and inner exception. + /// public RpcException(string message, System.Exception innerException) : base(message, innerException) { } diff --git a/Capnp.Net.Runtime/Rpc/Skeleton.cs b/Capnp.Net.Runtime/Rpc/Skeleton.cs index a0de624..9bbc793 100644 --- a/Capnp.Net.Runtime/Rpc/Skeleton.cs +++ b/Capnp.Net.Runtime/Rpc/Skeleton.cs @@ -101,6 +101,9 @@ namespace Capnp.Rpc { } + /// + /// Finalizer + /// ~Skeleton() { Dispose(false); diff --git a/Capnp.Net.Runtime/Rpc/TcpRpcClient.cs b/Capnp.Net.Runtime/Rpc/TcpRpcClient.cs index 89b2cbb..cf9c0ab 100644 --- a/Capnp.Net.Runtime/Rpc/TcpRpcClient.cs +++ b/Capnp.Net.Runtime/Rpc/TcpRpcClient.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.Net; using System.Net.Sockets; +using System.Runtime.CompilerServices; using System.Text; using System.Threading; using System.Threading.Tasks; @@ -54,16 +55,25 @@ namespace Capnp.Rpc async Task ConnectAsync(string host, int port) { - try + for (int retry = 0; ; retry++) { - await _client.ConnectAsync(host, port); - } - catch (SocketException exception) - { - throw new RpcException("TcpRpcClient is unable to connect", exception); - } + try + { + await _client.ConnectAsync(host, port); + return; + } + catch (SocketException exception) when (retry < 240 && exception.SocketErrorCode == SocketError.AddressAlreadyInUse) + { + await Task.Delay(1000); + } + catch (SocketException exception) + { + throw new RpcException("TcpRpcClient is unable to connect", exception); + } + } } + async Task Connect(string host, int port) { await ConnectAsync(host, port); @@ -103,6 +113,7 @@ namespace Capnp.Rpc { _rpcEngine = new RpcEngine(); _client = new TcpClient(); + _client.ExclusiveAddressUse = false; WhenConnected = Connect(host, port); } @@ -119,7 +130,7 @@ namespace Capnp.Rpc throw new InvalidOperationException("Connection not yet established"); } - if (!WhenConnected.IsCompletedSuccessfully) + if (!WhenConnected.ReplacementTaskIsCompletedSuccessfully()) { throw new InvalidOperationException("Connection not successfully established"); } @@ -143,8 +154,9 @@ namespace Capnp.Rpc Logger.LogError("Unable to join connection task within timeout"); } } - catch (System.Exception) + catch (System.Exception e) { + Logger.LogError(e, "Failure disposing client"); } if (_pumpThread != null && !_pumpThread.Join(500)) diff --git a/Capnp.Net.Runtime/Rpc/TcpRpcServer.cs b/Capnp.Net.Runtime/Rpc/TcpRpcServer.cs index e5dc638..54ceedf 100644 --- a/Capnp.Net.Runtime/Rpc/TcpRpcServer.cs +++ b/Capnp.Net.Runtime/Rpc/TcpRpcServer.cs @@ -14,12 +14,34 @@ namespace Capnp.Rpc /// public class TcpRpcServer: IDisposable { + /// + /// Models an incoming connection. + /// public interface IConnection { + /// + /// Server-side port + /// int LocalPort { get; } + + /// + /// Receive message counter + /// long RecvCount { get; } + + /// + /// Sent message counter + /// long SendCount { get; } + + /// + /// Whether the RPC engine is currently computing. + /// bool IsComputing { get; } + + /// + /// Whether the connection is idle, waiting for data to receive. + /// bool IsWaitingForData { get; } } @@ -169,9 +191,16 @@ namespace Capnp.Rpc } } - if (!_acceptorThread.Join(500)) + try { - Logger.LogError("Unable to join TCP acceptor thread within timeout"); + if (!_acceptorThread.Join(500)) + { + Logger.LogError("Unable to join TCP acceptor thread within timeout"); + } + } + catch (ThreadStateException) + { + // If acceptor thread was not yet started this is not a problem. Ignore. } GC.SuppressFinalize(this); @@ -188,12 +217,23 @@ namespace Capnp.Rpc { _rpcEngine = new RpcEngine(); _listener = new TcpListener(localAddr, port); - _listener.Start(); + _listener.ExclusiveAddressUse = false; - _acceptorThread = new Thread(() => + for (int retry = 0; retry < 5; retry++) { - AcceptClients(); - }); + try + { + _listener.Start(); + break; + } + catch (SocketException socketException) + { + Logger.LogWarning($"Failed to listen on port {port}, attempt {retry}: {socketException}"); + Thread.Sleep(10); + } + } + + _acceptorThread = new Thread(AcceptClients); _acceptorThread.Start(); } diff --git a/Capnp.Net.Runtime/Rpc/Vine.cs b/Capnp.Net.Runtime/Rpc/Vine.cs index 7c661a3..feb3bde 100644 --- a/Capnp.Net.Runtime/Rpc/Vine.cs +++ b/Capnp.Net.Runtime/Rpc/Vine.cs @@ -38,9 +38,15 @@ namespace Capnp.Rpc { async void SetupCancellation() { - using (var registration = cancellationToken.Register(promisedAnswer.Dispose)) + try + { + using (var registration = cancellationToken.Register(promisedAnswer.Dispose)) + { + await promisedAnswer.WhenReturned; + } + } + catch { - await promisedAnswer.WhenReturned; } } diff --git a/Capnp.Net.Runtime/Rpc/rpc.cs b/Capnp.Net.Runtime/Rpc/rpc.cs index 35b0269..61139b0 100644 --- a/Capnp.Net.Runtime/Rpc/rpc.cs +++ b/Capnp.Net.Runtime/Rpc/rpc.cs @@ -1,3 +1,5 @@ +#pragma warning disable CS1591 + using Capnp; using Capnp.Rpc; using System; diff --git a/Capnp.Net.Runtime/SegmentSlice.cs b/Capnp.Net.Runtime/SegmentSlice.cs index 68e3e76..22f5c9d 100644 --- a/Capnp.Net.Runtime/SegmentSlice.cs +++ b/Capnp.Net.Runtime/SegmentSlice.cs @@ -7,7 +7,14 @@ namespace Capnp /// public struct SegmentSlice { + /// + /// Segment index + /// public uint SegmentIndex; + + /// + /// Word offset within segment + /// public int Offset; } } diff --git a/Capnp.Net.Runtime/SerializerExtensions.cs b/Capnp.Net.Runtime/SerializerExtensions.cs index 97a2249..d9d384e 100644 --- a/Capnp.Net.Runtime/SerializerExtensions.cs +++ b/Capnp.Net.Runtime/SerializerExtensions.cs @@ -285,9 +285,9 @@ namespace Capnp public static float ReadDataFloat(this T d, ulong bitOffset, float defaultValue = 0) where T : IStructDeserializer { - int defaultBits = BitConverter.SingleToInt32Bits(defaultValue); + int defaultBits = defaultValue.ReplacementSingleToInt32Bits(); int bits = (int)d.StructReadData(bitOffset, 32) ^ defaultBits; - return BitConverter.Int32BitsToSingle(bits); + return bits.ReplacementInt32ToSingleBits(); } /// @@ -301,8 +301,8 @@ namespace Capnp public static void WriteData(this T d, ulong bitOffset, float value, float defaultValue = 0.0f) where T : IStructSerializer { - int bits = BitConverter.SingleToInt32Bits(value); - int defaultBits = BitConverter.SingleToInt32Bits(defaultValue); + int bits = value.ReplacementSingleToInt32Bits(); + int defaultBits = defaultValue.ReplacementSingleToInt32Bits(); WriteData(d, bitOffset, bits, defaultBits); } diff --git a/Capnp.Net.Runtime/SerializerState.cs b/Capnp.Net.Runtime/SerializerState.cs index c5a1452..14c994d 100644 --- a/Capnp.Net.Runtime/SerializerState.cs +++ b/Capnp.Net.Runtime/SerializerState.cs @@ -406,9 +406,10 @@ namespace Capnp /// is null /// out of range /// - /// This state does neither describe a struct, nor a list of pointers - /// Another state is already linked to the specified position (sorry, no overwrite allowed) - /// This state and belong to different message builder, and is false + /// This state does neither describe a struct, nor a list of pointers + /// Another state is already linked to the specified position (sorry, no overwrite allowed) + /// This state and belong to different message builder, and is false + /// /// protected void Link(int slot, SerializerState target, bool allowCopy = true) { @@ -461,7 +462,7 @@ namespace Capnp /// If this state describes a list of pointers: List element index. /// capability index inside the capability table /// - /// This state does neither describe a struct, nor a list of pointers + /// This state does neither describe a struct, nor a list of pointers /// Another state is already linked to the specified position (sorry, no overwrite allowed) /// protected void LinkToCapability(int slot, uint capabilityIndex) @@ -706,8 +707,8 @@ namespace Capnp /// Number of bits to read /// Data bits which were read /// The object was not determined to be a struct - /// The data slice specified by and - /// is not completely within the struct's data section, misaligned, exceeds one word, or is negative + /// The data slice specified by and + /// is not completely within the struct's data section, misaligned, exceeds one word, or is negative public ulong StructReadData(ulong bitOffset, int count) { if (Kind != ObjectKind.Struct) @@ -818,6 +819,13 @@ namespace Capnp /// is out of bounds. public SerializerState TryGetPointer(int index) => TryGetPointer(index); + /// + /// Reads text from a struct field or list element. + /// + /// If the underlying object is a struct: index into the struct's pointer section. + /// If the underlying object is a list of pointers: Element index + /// String to return in case of null + /// The decoded text public string ReadText(int index, string defaultText = null) { var b = BuildPointer(index); @@ -1068,7 +1076,11 @@ namespace Capnp { var bytes = ListGetBytes(); if (bytes.Length == 0) return string.Empty; +#if NETSTANDARD2_0 + return Encoding.UTF8.GetString(bytes.Slice(0, bytes.Length - 1).ToArray()); +#else return Encoding.UTF8.GetString(bytes.Slice(0, bytes.Length - 1)); +#endif } /// @@ -1164,8 +1176,8 @@ namespace Capnp /// is out of bounds. public void ListWriteValue(int index, float value, float defaultValue = 0) { - int rcastValue = BitConverter.SingleToInt32Bits(value); - int rcastDefaultValue = BitConverter.SingleToInt32Bits(defaultValue); + int rcastValue = value.ReplacementSingleToInt32Bits(); + int rcastDefaultValue = defaultValue.ReplacementSingleToInt32Bits(); ListWriteValue(index, rcastValue, rcastDefaultValue); } @@ -1256,7 +1268,7 @@ namespace Capnp /// /// Adds an entry to the capability table if the provided capability does not yet exist. /// - /// The capability, in one of the following forms: + /// The capability, in one of the following forms: /// Low-level capability object (Rpc.ConsumedCapability) /// Proxy object (Rpc.Proxy) /// Skeleton object (Rpc.Skeleton) @@ -1297,7 +1309,7 @@ namespace Capnp /// /// is out of range. /// - /// This state does neither describe a struct, nor a list of pointers + /// This state does neither describe a struct, nor a list of pointers /// Another state is already linked to the specified position (sorry, no overwrite allowed) /// public void LinkObject(int slot, T obj) @@ -1355,7 +1367,7 @@ namespace Capnp /// Index into this struct's pointer table. /// The proxy instance /// is out of range. - /// The desired interface does not qualify as capability interface ( + /// The desired interface does not qualify as capability interface () /// This state does not represent a struct. public T ReadCap(int slot) where T : class { diff --git a/Capnp.Net.Runtime/UtilityExtensions.cs b/Capnp.Net.Runtime/UtilityExtensions.cs new file mode 100644 index 0000000..09d6a14 --- /dev/null +++ b/Capnp.Net.Runtime/UtilityExtensions.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; + +namespace Capnp +{ + internal static class UtilityExtensions + { + /// + /// This method exists until NET Standard 2.1 is released + /// + /// + /// + /// + /// + /// + /// +#if NETSTANDARD2_0 + public static bool ReplacementTryAdd(this Dictionary thisDict, K key, V value) + { + if (thisDict.ContainsKey(key)) return false; + thisDict.Add(key, value); + return true; + } +#else + public static bool ReplacementTryAdd(this Dictionary thisDict, K key, V value) => thisDict.TryAdd(key, value); +#endif + + /// + /// This method exists until NET Standard 2.1 is released + /// + /// + /// + /// + /// + /// + /// +#if NETSTANDARD2_0 + public static bool ReplacementTryRemove(this Dictionary thisDict, K key, out V value) + { + if (!thisDict.ContainsKey(key)) + { + value = default; + return false; + } + value = thisDict[key]; + return thisDict.Remove(key); + } +#else + public static bool ReplacementTryRemove(this Dictionary thisDict, K key, out V value) => thisDict.Remove(key, out value); +#endif + + /// + /// This method exists until NET Standard 2.1 is released + /// + /// + /// +#if NETSTANDARD2_0 + public static bool ReplacementTaskIsCompletedSuccessfully(this Task task) + { + return task.IsCompleted && !task.IsCanceled && !task.IsFaulted; + } +#else + public static bool ReplacementTaskIsCompletedSuccessfully(this Task task) => task.IsCompletedSuccessfully; +#endif + +#if NETSTANDARD2_0 + public static int ReplacementSingleToInt32Bits(this float value) => BitConverter.ToInt32(BitConverter.GetBytes(value), 0); +#else + public static int ReplacementSingleToInt32Bits(this float value) => BitConverter.SingleToInt32Bits(value); +#endif + +#if NETSTANDARD2_0 + public static float ReplacementInt32ToSingleBits(this int value) => BitConverter.ToSingle(BitConverter.GetBytes(value), 0); +#else + public static float ReplacementInt32ToSingleBits(this int value) => BitConverter.Int32BitsToSingle(value); +#endif + } +} \ No newline at end of file diff --git a/Capnp.Net.Runtime/WirePointer.cs b/Capnp.Net.Runtime/WirePointer.cs index 9dfb8d0..9b41a67 100644 --- a/Capnp.Net.Runtime/WirePointer.cs +++ b/Capnp.Net.Runtime/WirePointer.cs @@ -5,13 +5,28 @@ using System.Text; namespace Capnp { /// - /// Pointer tag, + /// Pointer tag, see https://capnproto.org/encoding.html/> /// public enum PointerKind : byte { + /// + /// Struct pointer + /// Struct = 0, + + /// + /// List pointer + /// List = 1, + + /// + /// Far pointer + /// Far = 2, + + /// + /// Other (capability) pointer + /// Other = 3 } diff --git a/Capnp.Net.sln b/Capnp.Net.sln index 080c747..e12ef97 100644 --- a/Capnp.Net.sln +++ b/Capnp.Net.sln @@ -7,7 +7,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Capnp.Net.Runtime", "Capnp. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "capnpc-csharp", "capnpc-csharp\capnpc-csharp.csproj", "{D19E5EA7-D35B-4A1F-99CB-ED136316B577}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Capnp.Net.Runtime.Tests", "Capnp.Net.Runtime.Tests\Capnp.Net.Runtime.Tests.csproj", "{9ED38750-F83F-4B10-B3A3-4FD6183F9E86}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Capnp.Net.Runtime.Tests.Std20", "Capnp.Net.Runtime.Tests\Capnp.Net.Runtime.Tests.Std20.csproj", "{9ED38750-F83F-4B10-B3A3-4FD6183F9E86}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Capnp.Net.Runtime.Tests.Core21", "Capnp.Net.Runtime.Tests.Core21\Capnp.Net.Runtime.Tests.Core21.csproj", "{58E8FFC8-D207-4B0F-842A-58ED9D3D9EEF}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -23,14 +25,14 @@ Global {D19E5EA7-D35B-4A1F-99CB-ED136316B577}.Debug|Any CPU.Build.0 = Debug|Any CPU {D19E5EA7-D35B-4A1F-99CB-ED136316B577}.Release|Any CPU.ActiveCfg = Release|Any CPU {D19E5EA7-D35B-4A1F-99CB-ED136316B577}.Release|Any CPU.Build.0 = Release|Any CPU - {8C17F147-D784-4584-80FF-21BE03AC0D17}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8C17F147-D784-4584-80FF-21BE03AC0D17}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8C17F147-D784-4584-80FF-21BE03AC0D17}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8C17F147-D784-4584-80FF-21BE03AC0D17}.Release|Any CPU.Build.0 = Release|Any CPU {9ED38750-F83F-4B10-B3A3-4FD6183F9E86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9ED38750-F83F-4B10-B3A3-4FD6183F9E86}.Debug|Any CPU.Build.0 = Debug|Any CPU {9ED38750-F83F-4B10-B3A3-4FD6183F9E86}.Release|Any CPU.ActiveCfg = Release|Any CPU {9ED38750-F83F-4B10-B3A3-4FD6183F9E86}.Release|Any CPU.Build.0 = Release|Any CPU + {58E8FFC8-D207-4B0F-842A-58ED9D3D9EEF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {58E8FFC8-D207-4B0F-842A-58ED9D3D9EEF}.Debug|Any CPU.Build.0 = Debug|Any CPU + {58E8FFC8-D207-4B0F-842A-58ED9D3D9EEF}.Release|Any CPU.ActiveCfg = Release|Any CPU + {58E8FFC8-D207-4B0F-842A-58ED9D3D9EEF}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/capnpc-csharp/Program.cs b/capnpc-csharp/Program.cs index 779049a..4da2ad2 100644 --- a/capnpc-csharp/Program.cs +++ b/capnpc-csharp/Program.cs @@ -1,8 +1,6 @@ using Capnp; using System; using System.IO; -using System.Linq; -using System.Runtime.InteropServices; namespace CapnpC { @@ -17,22 +15,33 @@ namespace CapnpC input = new FileStream(args[0], FileMode.Open, FileAccess.Read); } else - { + { + Console.WriteLine("Cap'n Proto C# code generator backend"); + Console.WriteLine("expecting binary-encoded code generation request from standard input"); + input = Console.OpenStandardInput(); } - WireFrame segments; - - using (input) + try { - segments = Framing.ReadSegments(input); - } + WireFrame segments; - var dec = DeserializerState.CreateRoot(segments); - var reader = Schema.CodeGeneratorRequest.Reader.Create(dec); - var model = Model.SchemaModel.Create(reader); - var codeGen = new Generator.CodeGenerator(model, new Generator.GeneratorOptions()); - codeGen.Generate(); + using (input) + { + segments = Framing.ReadSegments(input); + } + + var dec = DeserializerState.CreateRoot(segments); + var reader = Schema.CodeGeneratorRequest.Reader.Create(dec); + var model = Model.SchemaModel.Create(reader); + var codeGen = new Generator.CodeGenerator(model, new Generator.GeneratorOptions()); + codeGen.Generate(); + } + catch (Exception exception) + { + Console.Error.WriteLine(exception.Message); + Environment.ExitCode = -1; + } } } } diff --git a/capnpc-csharp/capnpc-csharp.csproj b/capnpc-csharp/capnpc-csharp.csproj index 76ee9e5..93bdeb0 100644 --- a/capnpc-csharp/capnpc-csharp.csproj +++ b/capnpc-csharp/capnpc-csharp.csproj @@ -1,10 +1,19 @@ - + Exe netcoreapp2.1 CapnpC 7.1 + true + MIT + Christian Köllner and contributors + Cap'n Proto C# code generator backend + Christian Köllner and contributors + https://github.com/c80k/capnproto-dotnetcore + Git + capnp capnpc RPC serialization cerealization + 1.0.0 diff --git a/chocolatey/capnpc-csharp-win-x86/capnpc-csharp-win-x86.nuspec b/chocolatey/capnpc-csharp-win-x86/capnpc-csharp-win-x86.nuspec new file mode 100644 index 0000000..7ccff88 --- /dev/null +++ b/chocolatey/capnpc-csharp-win-x86/capnpc-csharp-win-x86.nuspec @@ -0,0 +1,22 @@ + + + + capnpc-csharp-win-x86 + 1.0.0 + Christian Köllner and contributors + Christian Köllner and contributors + false + + https://licenses.nuget.org/MIT + https://github.com/c80k/capnproto-dotnetcore + Cap'n Proto C# code generator backend, self-contained Windows x86 + Christian Köllner and contributors + capnp capnpc RPC serialization cerealization + + + + + + + + \ No newline at end of file diff --git a/chocolatey/capnpc-csharp-win-x86/chocolateyinstall.ps1 b/chocolatey/capnpc-csharp-win-x86/chocolateyinstall.ps1 new file mode 100644 index 0000000..e54c74c --- /dev/null +++ b/chocolatey/capnpc-csharp-win-x86/chocolateyinstall.ps1 @@ -0,0 +1,6 @@ +$ErrorActionPreference = 'Stop' + +$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" + +choco install capnproto +Install-Binfile -Name capnpc-csharp -Path "$toolsDir\capnpc-csharp.exe" diff --git a/chocolatey/capnpc-csharp-win-x86/chocolateyuninstall.ps1 b/chocolatey/capnpc-csharp-win-x86/chocolateyuninstall.ps1 new file mode 100644 index 0000000..e327e42 --- /dev/null +++ b/chocolatey/capnpc-csharp-win-x86/chocolateyuninstall.ps1 @@ -0,0 +1,3 @@ +$ErrorActionPreference = 'Stop' + +Uninstall-BinFile capnpc-sharp \ No newline at end of file diff --git a/chocolatey/capnpc-csharp/capnpc-csharp.nuspec b/chocolatey/capnpc-csharp/capnpc-csharp.nuspec new file mode 100644 index 0000000..268a3dd --- /dev/null +++ b/chocolatey/capnpc-csharp/capnpc-csharp.nuspec @@ -0,0 +1,22 @@ + + + + capnpc-csharp-win-x86 + 1.0.0 + Christian Köllner and contributors + Christian Köllner and contributors + false + + https://licenses.nuget.org/MIT + https://github.com/c80k/capnproto-dotnetcore + Cap'n Proto C# code generator backend, portable .NET Core 2.1 + Christian Köllner and contributors + capnp capnpc RPC serialization cerealization + + + + + + + + \ No newline at end of file diff --git a/chocolatey/capnpc-csharp/chocolateyinstall.ps1 b/chocolatey/capnpc-csharp/chocolateyinstall.ps1 new file mode 100644 index 0000000..cc77a2d --- /dev/null +++ b/chocolatey/capnpc-csharp/chocolateyinstall.ps1 @@ -0,0 +1,5 @@ +$ErrorActionPreference = 'Stop' + +$toolsDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)" + +Install-Binfile -Name capnpc-csharp -Path "dotnet" -Command "$toolsDir\capnpc-csharp.dll" \ No newline at end of file diff --git a/chocolatey/capnpc-csharp/chocolateyuninstall.ps1 b/chocolatey/capnpc-csharp/chocolateyuninstall.ps1 new file mode 100644 index 0000000..e327e42 --- /dev/null +++ b/chocolatey/capnpc-csharp/chocolateyuninstall.ps1 @@ -0,0 +1,3 @@ +$ErrorActionPreference = 'Stop' + +Uninstall-BinFile capnpc-sharp \ No newline at end of file diff --git a/chocolatey/deploy/capnpc-csharp.deps.json b/chocolatey/deploy/capnpc-csharp.deps.json new file mode 100644 index 0000000..477ed25 --- /dev/null +++ b/chocolatey/deploy/capnpc-csharp.deps.json @@ -0,0 +1,2464 @@ +{ + "runtimeTarget": { + "name": ".NETCoreApp,Version=v2.1/win-x86", + "signature": "6a07f9ddd438cc6712001c4323ccce0127f8888f" + }, + "compilationOptions": {}, + "targets": { + ".NETCoreApp,Version=v2.1": {}, + ".NETCoreApp,Version=v2.1/win-x86": { + "capnpc-csharp/1.0.0": { + "dependencies": { + "Capnp.Net.Runtime": "1.0.0", + "Microsoft.CodeAnalysis.CSharp": "2.10.0", + "Microsoft.Extensions.Logging": "2.2.0", + "Microsoft.NETCore.App": "2.1.12" + }, + "runtime": { + "capnpc-csharp.dll": {} + } + }, + "Microsoft.CodeAnalysis.Analyzers/2.6.1": {}, + "Microsoft.CodeAnalysis.Common/2.10.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Analyzers": "2.6.1", + "System.AppContext": "4.3.0", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Collections.Immutable": "1.5.0", + "System.Console": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.FileVersionInfo": "4.3.0", + "System.Diagnostics.StackTrace": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Dynamic.Runtime": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO.Compression": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Metadata": "1.6.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.X509Certificates": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.CodePages": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0", + "System.Threading.Tasks.Parallel": "4.3.0", + "System.Threading.Thread": "4.3.0", + "System.ValueTuple": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XPath.XDocument": "4.3.0", + "System.Xml.XmlDocument": "4.3.0" + }, + "runtime": { + "lib/netstandard1.3/Microsoft.CodeAnalysis.dll": { + "assemblyVersion": "2.10.0.0", + "fileVersion": "2.10.0.0" + } + }, + "resources": { + "lib/netstandard1.3/cs/Microsoft.CodeAnalysis.resources.dll": { + "locale": "cs" + }, + "lib/netstandard1.3/de/Microsoft.CodeAnalysis.resources.dll": { + "locale": "de" + }, + "lib/netstandard1.3/es/Microsoft.CodeAnalysis.resources.dll": { + "locale": "es" + }, + "lib/netstandard1.3/fr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "fr" + }, + "lib/netstandard1.3/it/Microsoft.CodeAnalysis.resources.dll": { + "locale": "it" + }, + "lib/netstandard1.3/ja/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ja" + }, + "lib/netstandard1.3/ko/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ko" + }, + "lib/netstandard1.3/pl/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pl" + }, + "lib/netstandard1.3/pt-BR/Microsoft.CodeAnalysis.resources.dll": { + "locale": "pt-BR" + }, + "lib/netstandard1.3/ru/Microsoft.CodeAnalysis.resources.dll": { + "locale": "ru" + }, + "lib/netstandard1.3/tr/Microsoft.CodeAnalysis.resources.dll": { + "locale": "tr" + }, + "lib/netstandard1.3/zh-Hans/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netstandard1.3/zh-Hant/Microsoft.CodeAnalysis.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.CodeAnalysis.CSharp/2.10.0": { + "dependencies": { + "Microsoft.CodeAnalysis.Common": "2.10.0" + }, + "runtime": { + "lib/netstandard1.3/Microsoft.CodeAnalysis.CSharp.dll": { + "assemblyVersion": "2.10.0.0", + "fileVersion": "2.10.0.0" + } + }, + "resources": { + "lib/netstandard1.3/cs/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "cs" + }, + "lib/netstandard1.3/de/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "de" + }, + "lib/netstandard1.3/es/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "es" + }, + "lib/netstandard1.3/fr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "fr" + }, + "lib/netstandard1.3/it/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "it" + }, + "lib/netstandard1.3/ja/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ja" + }, + "lib/netstandard1.3/ko/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ko" + }, + "lib/netstandard1.3/pl/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pl" + }, + "lib/netstandard1.3/pt-BR/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "pt-BR" + }, + "lib/netstandard1.3/ru/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "ru" + }, + "lib/netstandard1.3/tr/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "tr" + }, + "lib/netstandard1.3/zh-Hans/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hans" + }, + "lib/netstandard1.3/zh-Hant/Microsoft.CodeAnalysis.CSharp.resources.dll": { + "locale": "zh-Hant" + } + } + }, + "Microsoft.Extensions.Configuration/2.2.0": { + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "2.2.0" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Configuration.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.18315" + } + } + }, + "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { + "dependencies": { + "Microsoft.Extensions.Primitives": "2.2.0" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Configuration.Abstractions.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.18315" + } + } + }, + "Microsoft.Extensions.Configuration.Binder/2.2.0": { + "dependencies": { + "Microsoft.Extensions.Configuration": "2.2.0" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Configuration.Binder.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.18315" + } + } + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.DependencyInjection.Abstractions.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.18315" + } + } + }, + "Microsoft.Extensions.Logging/2.2.0": { + "dependencies": { + "Microsoft.Extensions.Configuration.Binder": "2.2.0", + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.Logging.Abstractions": "2.2.0", + "Microsoft.Extensions.Options": "2.2.0" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Logging.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.18315" + } + } + }, + "Microsoft.Extensions.Logging.Abstractions/2.2.0": { + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Logging.Abstractions.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.18315" + } + } + }, + "Microsoft.Extensions.Options/2.2.0": { + "dependencies": { + "Microsoft.Extensions.DependencyInjection.Abstractions": "2.2.0", + "Microsoft.Extensions.Primitives": "2.2.0", + "System.ComponentModel.Annotations": "4.5.0" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Options.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.18315" + } + } + }, + "Microsoft.Extensions.Primitives/2.2.0": { + "dependencies": { + "System.Memory": "4.5.1", + "System.Runtime.CompilerServices.Unsafe": "4.5.1" + }, + "runtime": { + "lib/netstandard2.0/Microsoft.Extensions.Primitives.dll": { + "assemblyVersion": "2.2.0.0", + "fileVersion": "2.2.0.18315" + } + } + }, + "Microsoft.NETCore.App/2.1.12": { + "dependencies": { + "Microsoft.NETCore.DotNetHostPolicy": "2.1.12", + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "NETStandard.Library": "2.0.3", + "runtime.win-x86.Microsoft.NETCore.App": "2.1.12" + } + }, + "Microsoft.NETCore.DotNetAppHost/2.1.12": { + "dependencies": { + "runtime.win-x86.Microsoft.NETCore.DotNetAppHost": "2.1.12" + } + }, + "Microsoft.NETCore.DotNetHostPolicy/2.1.12": { + "dependencies": { + "Microsoft.NETCore.DotNetHostResolver": "2.1.12", + "runtime.win-x86.Microsoft.NETCore.DotNetHostPolicy": "2.1.12" + } + }, + "Microsoft.NETCore.DotNetHostResolver/2.1.12": { + "dependencies": { + "Microsoft.NETCore.DotNetAppHost": "2.1.12", + "runtime.win-x86.Microsoft.NETCore.DotNetHostResolver": "2.1.12" + } + }, + "Microsoft.NETCore.Platforms/2.1.5": {}, + "Microsoft.NETCore.Targets/2.0.0": {}, + "NETStandard.Library/2.0.3": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5" + } + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.native.System/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0" + } + }, + "runtime.native.System.IO.Compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0" + } + }, + "runtime.native.System.Net.Http/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0" + } + }, + "runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "dependencies": { + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple": "4.3.0" + } + }, + "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "dependencies": { + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0", + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": {}, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": {}, + "runtime.win-x86.Microsoft.NETCore.App/2.1.12": { + "runtime": { + "runtimes/win-x86/lib/netcoreapp2.1/Microsoft.CSharp.dll": { + "assemblyVersion": "4.0.4.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/Microsoft.VisualBasic.dll": { + "assemblyVersion": "10.0.4.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/Microsoft.Win32.Primitives.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/Microsoft.Win32.Registry.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/SOS.NETCore.dll": { + "assemblyVersion": "1.0.0.0", + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.AppContext.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Buffers.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Collections.Concurrent.dll": { + "assemblyVersion": "4.0.14.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Collections.Immutable.dll": { + "assemblyVersion": "1.2.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Collections.NonGeneric.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Collections.Specialized.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Collections.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ComponentModel.Annotations.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ComponentModel.DataAnnotations.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ComponentModel.EventBasedAsync.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ComponentModel.Primitives.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ComponentModel.TypeConverter.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ComponentModel.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Configuration.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Console.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Core.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Data.Common.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Data.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.Contracts.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.Debug.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.DiagnosticSource.dll": { + "assemblyVersion": "4.0.3.1", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.FileVersionInfo.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.Process.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.StackTrace.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.TextWriterTraceListener.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.Tools.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.TraceSource.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Diagnostics.Tracing.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Drawing.Primitives.dll": { + "assemblyVersion": "4.2.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Drawing.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Dynamic.Runtime.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Globalization.Calendars.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Globalization.Extensions.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Globalization.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.Compression.Brotli.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.Compression.FileSystem.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.Compression.ZipFile.dll": { + "assemblyVersion": "4.0.4.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.Compression.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.FileSystem.AccessControl.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.FileSystem.DriveInfo.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.FileSystem.Primitives.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.FileSystem.Watcher.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.FileSystem.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.IsolatedStorage.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.MemoryMappedFiles.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.Pipes.AccessControl.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.Pipes.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.UnmanagedMemoryStream.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.IO.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Linq.Expressions.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Linq.Parallel.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Linq.Queryable.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Linq.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Memory.dll": { + "assemblyVersion": "4.1.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.Http.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.HttpListener.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.Mail.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.NameResolution.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.NetworkInformation.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.Ping.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.Primitives.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.Requests.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.Security.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.ServicePoint.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.Sockets.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.WebClient.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.WebHeaderCollection.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.WebProxy.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.WebSockets.Client.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.WebSockets.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Net.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Numerics.Vectors.dll": { + "assemblyVersion": "4.1.4.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Numerics.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ObjectModel.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Private.DataContractSerialization.dll": { + "assemblyVersion": "4.1.4.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Private.Uri.dll": { + "assemblyVersion": "4.0.5.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Private.Xml.Linq.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Private.Xml.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.DispatchProxy.dll": { + "assemblyVersion": "4.0.4.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.Emit.ILGeneration.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.Emit.Lightweight.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.Emit.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.Extensions.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.Metadata.dll": { + "assemblyVersion": "1.4.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.Primitives.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.TypeExtensions.dll": { + "assemblyVersion": "4.1.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Reflection.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Resources.Reader.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Resources.ResourceManager.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Resources.Writer.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.CompilerServices.VisualC.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Extensions.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Handles.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.InteropServices.RuntimeInformation.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.InteropServices.WindowsRuntime.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.InteropServices.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Loader.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Numerics.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Serialization.Formatters.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Serialization.Json.dll": { + "assemblyVersion": "4.0.4.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Serialization.Primitives.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Serialization.Xml.dll": { + "assemblyVersion": "4.1.4.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Runtime.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.AccessControl.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Claims.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Cryptography.Algorithms.dll": { + "assemblyVersion": "4.3.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Cryptography.Cng.dll": { + "assemblyVersion": "4.3.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Cryptography.Csp.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Cryptography.Encoding.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Cryptography.OpenSsl.dll": { + "assemblyVersion": "4.1.1.1", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Cryptography.Primitives.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Cryptography.X509Certificates.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Principal.Windows.dll": { + "assemblyVersion": "4.1.1.1", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.Principal.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.SecureString.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Security.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ServiceModel.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ServiceProcess.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Text.Encoding.Extensions.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Text.Encoding.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Text.RegularExpressions.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.Overlapped.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.Tasks.Dataflow.dll": { + "assemblyVersion": "4.6.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.Tasks.Extensions.dll": { + "assemblyVersion": "4.3.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.Tasks.Parallel.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.Tasks.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.Thread.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.ThreadPool.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.Timer.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Threading.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Transactions.Local.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Transactions.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.ValueTuple.dll": { + "assemblyVersion": "4.0.3.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Web.HttpUtility.dll": { + "assemblyVersion": "4.0.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Web.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Windows.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.Linq.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.ReaderWriter.dll": { + "assemblyVersion": "4.2.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.Serialization.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.XDocument.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.XPath.XDocument.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.XPath.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.XmlDocument.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.XmlSerializer.dll": { + "assemblyVersion": "4.1.1.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.Xml.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/System.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/WindowsBase.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/mscorlib.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/lib/netcoreapp2.1/netstandard.dll": { + "assemblyVersion": "2.0.0.0", + "fileVersion": "4.6.27818.1" + } + }, + "native": { + "runtimes/win-x86/native/API-MS-Win-core-xstate-l2-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/Microsoft.DiaSymReader.Native.x86.dll": { + "fileVersion": "14.12.25830.2" + }, + "runtimes/win-x86/native/System.Private.CoreLib.dll": { + "assemblyVersion": "4.0.0.0", + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/api-ms-win-core-console-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-datetime-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-debug-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-errorhandling-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-file-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-file-l1-2-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-file-l2-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-handle-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-heap-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-interlocked-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-libraryloader-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-localization-l1-2-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-memory-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-namedpipe-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-processenvironment-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-processthreads-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-processthreads-l1-1-1.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-profile-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-rtlsupport-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-string-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-synch-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-synch-l1-2-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-sysinfo-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-timezone-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-core-util-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-conio-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-convert-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-environment-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-filesystem-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-heap-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-locale-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-math-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-multibyte-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-private-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-process-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-runtime-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-stdio-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-string-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-time-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/api-ms-win-crt-utility-l1-1-0.dll": { + "fileVersion": "10.0.17134.12" + }, + "runtimes/win-x86/native/clrcompression.dll": { + "fileVersion": "4.6.27818.1" + }, + "runtimes/win-x86/native/clretwrc.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/clrjit.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/coreclr.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/dbgshim.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/mscordaccore.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/mscordaccore_x86_x86_4.6.27817.01.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/mscordbi.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/mscorrc.debug.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/mscorrc.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/sos.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/sos_x86_x86_4.6.27817.01.dll": { + "fileVersion": "4.6.27817.1" + }, + "runtimes/win-x86/native/ucrtbase.dll": { + "fileVersion": "10.0.17134.12" + } + } + }, + "runtime.win-x86.Microsoft.NETCore.DotNetAppHost/2.1.12": { + "native": { + "runtimes/win-x86/native/apphost.exe": { + "fileVersion": "0.0.0.0" + } + } + }, + "runtime.win-x86.Microsoft.NETCore.DotNetHostPolicy/2.1.12": { + "dependencies": { + "Microsoft.NETCore.DotNetHostResolver": "2.1.12" + }, + "native": { + "runtimes/win-x86/native/hostpolicy.dll": { + "fileVersion": "2.1.27818.1" + } + } + }, + "runtime.win-x86.Microsoft.NETCore.DotNetHostResolver/2.1.12": { + "dependencies": { + "Microsoft.NETCore.DotNetAppHost": "2.1.12" + }, + "native": { + "runtimes/win-x86/native/hostfxr.dll": { + "fileVersion": "2.1.27818.1" + } + } + }, + "System.AppContext/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Buffers/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Collections/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Collections.Concurrent/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Collections.Immutable/1.5.0": {}, + "System.ComponentModel.Annotations/4.5.0": {}, + "System.Console/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.IO": "4.3.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Diagnostics.Debug/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.FileVersionInfo/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Reflection.Metadata": "1.6.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0" + } + }, + "System.Diagnostics.StackTrace/4.3.0": { + "dependencies": { + "System.IO.FileSystem": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Metadata": "1.6.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tools/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Diagnostics.Tracing/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Dynamic.Runtime/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Linq.Expressions": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Globalization/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Globalization.Calendars/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Globalization": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.IO/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.Compression/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "System.Buffers": "4.3.0", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.IO.Compression": "4.3.0" + } + }, + "System.IO.FileSystem/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.IO": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Linq/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Linq.Expressions/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Linq": "4.3.0", + "System.ObjectModel": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Emit.Lightweight": "4.3.0", + "System.Reflection.Extensions": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Reflection.TypeExtensions": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Memory/4.5.1": {}, + "System.ObjectModel/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Reflection/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.IO": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit/4.3.0": { + "dependencies": { + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.ILGeneration/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Emit.Lightweight/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Reflection.Emit.ILGeneration": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.Metadata/1.6.0": {}, + "System.Reflection.Primitives/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Reflection.TypeExtensions/4.3.0": { + "dependencies": { + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Resources.ResourceManager/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Globalization": "4.3.0", + "System.Reflection": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0" + } + }, + "System.Runtime.CompilerServices.Unsafe/4.5.1": { + "runtime": { + "lib/netcoreapp2.0/System.Runtime.CompilerServices.Unsafe.dll": { + "assemblyVersion": "4.0.4.0", + "fileVersion": "0.0.0.0" + } + } + }, + "System.Runtime.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.Handles/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Runtime.InteropServices/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Reflection": "4.3.0", + "System.Reflection.Primitives": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Handles": "4.3.0" + } + }, + "System.Runtime.Numerics/4.3.0": { + "dependencies": { + "System.Globalization": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0" + } + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.Apple": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Cng/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Security.Cryptography.Csp/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + } + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "System.Collections": "4.3.0", + "System.Collections.Concurrent": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.OpenSsl/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.Globalization.Calendars": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Runtime.Numerics": "4.3.0", + "System.Security.Cryptography.Algorithms": "4.3.0", + "System.Security.Cryptography.Cng": "4.3.0", + "System.Security.Cryptography.Csp": "4.3.0", + "System.Security.Cryptography.Encoding": "4.3.0", + "System.Security.Cryptography.OpenSsl": "4.3.0", + "System.Security.Cryptography.Primitives": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "runtime.native.System": "4.3.0", + "runtime.native.System.Net.Http": "4.3.0", + "runtime.native.System.Security.Cryptography.OpenSsl": "4.3.0" + } + }, + "System.Text.Encoding/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Text.Encoding.CodePages/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "System.Collections": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.Handles": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0" + }, + "runtime": { + "runtimes/win/lib/netstandard1.3/System.Text.Encoding.CodePages.dll": { + "assemblyVersion": "4.0.2.0", + "fileVersion": "4.6.24702.1" + } + } + }, + "System.Text.Encoding.Extensions/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0", + "System.Text.Encoding": "4.3.0" + } + }, + "System.Text.RegularExpressions/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.Threading/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks/4.3.0": { + "dependencies": { + "Microsoft.NETCore.Platforms": "2.1.5", + "Microsoft.NETCore.Targets": "2.0.0", + "System.Runtime": "4.3.0" + } + }, + "System.Threading.Tasks.Extensions/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Runtime": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Tasks.Parallel/4.3.0": { + "dependencies": { + "System.Collections.Concurrent": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tracing": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Threading.Tasks": "4.3.0" + } + }, + "System.Threading.Thread/4.3.0": { + "dependencies": { + "System.Runtime": "4.3.0" + } + }, + "System.ValueTuple/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0" + } + }, + "System.Xml.ReaderWriter/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.IO.FileSystem": "4.3.0", + "System.IO.FileSystem.Primitives": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Runtime.InteropServices": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Text.Encoding.Extensions": "4.3.0", + "System.Text.RegularExpressions": "4.3.0", + "System.Threading.Tasks": "4.3.0", + "System.Threading.Tasks.Extensions": "4.3.0" + } + }, + "System.Xml.XDocument/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Diagnostics.Tools": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Reflection": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XmlDocument/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Text.Encoding": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XPath/4.3.0": { + "dependencies": { + "System.Collections": "4.3.0", + "System.Diagnostics.Debug": "4.3.0", + "System.Globalization": "4.3.0", + "System.IO": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0" + } + }, + "System.Xml.XPath.XDocument/4.3.0": { + "dependencies": { + "System.Diagnostics.Debug": "4.3.0", + "System.Linq": "4.3.0", + "System.Resources.ResourceManager": "4.3.0", + "System.Runtime": "4.3.0", + "System.Runtime.Extensions": "4.3.0", + "System.Threading": "4.3.0", + "System.Xml.ReaderWriter": "4.3.0", + "System.Xml.XDocument": "4.3.0", + "System.Xml.XPath": "4.3.0" + } + }, + "Capnp.Net.Runtime/1.0.0": { + "dependencies": { + "Microsoft.Extensions.Logging": "2.2.0" + }, + "runtime": { + "Capnp.Net.Runtime.dll": {} + } + } + } + }, + "libraries": { + "capnpc-csharp/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + }, + "Microsoft.CodeAnalysis.Analyzers/2.6.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VsT6gg2SPeToP8SK7PEcsH6Ftryb7aOqnXh9xg11zBeov05+63gP3k/TvrR+v85XIa8Nn0y3+qNl4M+qzNLBfw==", + "path": "microsoft.codeanalysis.analyzers/2.6.1", + "hashPath": "microsoft.codeanalysis.analyzers.2.6.1.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.Common/2.10.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-w57ebW3QIRFPoFFX6GCa6eF2FmuHYaWEJ/sMMHq+PBnHB51dEzLIoAQft1Byqe5nrSo4UUV6v4tad8fkTrKl8w==", + "path": "microsoft.codeanalysis.common/2.10.0", + "hashPath": "microsoft.codeanalysis.common.2.10.0.nupkg.sha512" + }, + "Microsoft.CodeAnalysis.CSharp/2.10.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bTr6j4V7G4ZPhRDUdowdtbEvXsQA4w1TYfOtXiYdv8TF7STl9ShOKtlSVzAusmeEWsZksJm9D1VSxt6XIyNB0w==", + "path": "microsoft.codeanalysis.csharp/2.10.0", + "hashPath": "microsoft.codeanalysis.csharp.2.10.0.nupkg.sha512" + }, + "Microsoft.Extensions.Configuration/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-nOP8R1mVb/6mZtm2qgAJXn/LFm/2kMjHDAg/QJLFG6CuWYJtaD3p1BwQhufBVvRzL9ceJ/xF0SQ0qsI2GkDQAA==", + "path": "microsoft.extensions.configuration/2.2.0", + "hashPath": "microsoft.extensions.configuration.2.2.0.nupkg.sha512" + }, + "Microsoft.Extensions.Configuration.Abstractions/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-65MrmXCziWaQFrI0UHkQbesrX5wTwf9XPjY5yFm/VkgJKFJ5gqvXRoXjIZcf2wLi5ZlwGz/oMYfyURVCWbM5iw==", + "path": "microsoft.extensions.configuration.abstractions/2.2.0", + "hashPath": "microsoft.extensions.configuration.abstractions.2.2.0.nupkg.sha512" + }, + "Microsoft.Extensions.Configuration.Binder/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vJ9xvOZCnUAIHcGC3SU35r3HKmHTVIeHzo6u/qzlHAqD8m6xv92MLin4oJntTvkpKxVX3vI1GFFkIQtU3AdlsQ==", + "path": "microsoft.extensions.configuration.binder/2.2.0", + "hashPath": "microsoft.extensions.configuration.binder.2.2.0.nupkg.sha512" + }, + "Microsoft.Extensions.DependencyInjection.Abstractions/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-f9hstgjVmr6rmrfGSpfsVOl2irKAgr1QjrSi3FgnS7kulxband50f2brRLwySAQTADPZeTdow0mpSMcoAdadCw==", + "path": "microsoft.extensions.dependencyinjection.abstractions/2.2.0", + "hashPath": "microsoft.extensions.dependencyinjection.abstractions.2.2.0.nupkg.sha512" + }, + "Microsoft.Extensions.Logging/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Nxqhadc9FCmFHzU+fz3oc8sFlE6IadViYg8dfUdGzJZ2JUxnCsRghBhhOWdM4B2zSZqEc+0BjliBh/oNdRZuig==", + "path": "microsoft.extensions.logging/2.2.0", + "hashPath": "microsoft.extensions.logging.2.2.0.nupkg.sha512" + }, + "Microsoft.Extensions.Logging.Abstractions/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-B2WqEox8o+4KUOpL7rZPyh6qYjik8tHi2tN8Z9jZkHzED8ElYgZa/h6K+xliB435SqUcWT290Fr2aa8BtZjn8A==", + "path": "microsoft.extensions.logging.abstractions/2.2.0", + "hashPath": "microsoft.extensions.logging.abstractions.2.2.0.nupkg.sha512" + }, + "Microsoft.Extensions.Options/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UpZLNLBpIZ0GTebShui7xXYh6DmBHjWM8NxGxZbdQh/bPZ5e6YswqI+bru6BnEL5eWiOdodsXtEz3FROcgi/qg==", + "path": "microsoft.extensions.options/2.2.0", + "hashPath": "microsoft.extensions.options.2.2.0.nupkg.sha512" + }, + "Microsoft.Extensions.Primitives/2.2.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-azyQtqbm4fSaDzZHD/J+V6oWMFaf2tWP4WEGIYePLCMw3+b2RQdj9ybgbQyjCshcitQKQ4lEDOZjmSlTTrHxUg==", + "path": "microsoft.extensions.primitives/2.2.0", + "hashPath": "microsoft.extensions.primitives.2.2.0.nupkg.sha512" + }, + "Microsoft.NETCore.App/2.1.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oVeSsnIqzD0VuS3xoZRA1SAfq/aLscEy12TaeIP5H6FIOBo9Ta1sMkyc7Pj3ZDJz3fsWeYf/4fR5Ft8Y+oqdzg==", + "path": "microsoft.netcore.app/2.1.12", + "hashPath": "microsoft.netcore.app.2.1.12.nupkg.sha512" + }, + "Microsoft.NETCore.DotNetAppHost/2.1.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bjRuqLIp7JLORwwH5PTZOKIozs68ulLLcSMRcTmOymOqV35PFE+VE6M2SmR6OQsxG0ViIuxM1YwQdYwlIzG3cQ==", + "path": "microsoft.netcore.dotnetapphost/2.1.12", + "hashPath": "microsoft.netcore.dotnetapphost.2.1.12.nupkg.sha512" + }, + "Microsoft.NETCore.DotNetHostPolicy/2.1.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-A1tafTgEtO7yLIst4n7PrZJtqyc25JHEPII5/2tTIqTymaUA8p8wun9SpwX0dTYxcQbQmfK2yp402kuHU3oVcQ==", + "path": "microsoft.netcore.dotnethostpolicy/2.1.12", + "hashPath": "microsoft.netcore.dotnethostpolicy.2.1.12.nupkg.sha512" + }, + "Microsoft.NETCore.DotNetHostResolver/2.1.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-S7trRhPhQ/O+ZapKoKyjmiveC78yUAQ1usE3qsVT2W9NfI1Hk04aIwDwmio9GWNqUljXzCbK+B7h9CQe5GPJMQ==", + "path": "microsoft.netcore.dotnethostresolver/2.1.12", + "hashPath": "microsoft.netcore.dotnethostresolver.2.1.12.nupkg.sha512" + }, + "Microsoft.NETCore.Platforms/2.1.5": { + "type": "package", + "serviceable": true, + "sha512": "sha512-FW1dYOftgUODWh91w97B7fJL9oaderZzbIOGNRe3FS9Yl40yaMz+cHWdQ+X9uE9agCmLzuCx/Yyxt8QSnooHsA==", + "path": "microsoft.netcore.platforms/2.1.5", + "hashPath": "microsoft.netcore.platforms.2.1.5.nupkg.sha512" + }, + "Microsoft.NETCore.Targets/2.0.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-odP/tJj1z6GylFpNo7pMtbd/xQgTC3Ex2If63dRTL38bBNMwsBnJ+RceUIyHdRBC0oik/3NehYT+oECwBhIM3Q==", + "path": "microsoft.netcore.targets/2.0.0", + "hashPath": "microsoft.netcore.targets.2.0.0.nupkg.sha512" + }, + "NETStandard.Library/2.0.3": { + "type": "package", + "serviceable": true, + "sha512": "sha512-st47PosZSHrjECdjeIzZQbzivYBJFv6P2nv4cj2ypdI204DO+vZ7l5raGMiX4eXMJ53RfOIg+/s4DHVZ54Nu2A==", + "path": "netstandard.library/2.0.3", + "hashPath": "netstandard.library.2.0.3.nupkg.sha512" + }, + "runtime.debian.8-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-HdSSp5MnJSsg08KMfZThpuLPJpPwE5hBXvHwoKWosyHHfe8Mh5WKT0ylEOf6yNzX6Ngjxe4Whkafh5q7Ymac4Q==", + "path": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.debian.8-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.23-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-+yH1a49wJMy8Zt4yx5RhJrxO/DBDByAiCzNwiETI+1S4mPdCu0OY4djdciC7Vssk0l22wQaDLrXxXkp+3+7bVA==", + "path": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.23-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.fedora.24-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c3YNH1GQJbfIPJeCnr4avseugSqPrxwIqzthYyZDN6EuOyNOzq+y2KSUfRcXauya1sF4foESTgwM5e1A8arAKw==", + "path": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.fedora.24-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.native.System/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-c/qWt2LieNZIj1jGnVNsE2Kl23Ya2aSTBuXMD6V7k9KWr6l16Tqdwq+hJScEpWER9753NWC8h96PaVNY5Ld7Jw==", + "path": "runtime.native.system/4.3.0", + "hashPath": "runtime.native.system.4.3.0.nupkg.sha512" + }, + "runtime.native.System.IO.Compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-INBPonS5QPEgn7naufQFXJEp3zX6L4bwHgJ/ZH78aBTpeNfQMtf7C6VrAFhlq2xxWBveIOWyFzQjJ8XzHMhdOQ==", + "path": "runtime.native.system.io.compression/4.3.0", + "hashPath": "runtime.native.system.io.compression.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Net.Http/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZVuZJqnnegJhd2k/PtAbbIcZ3aZeITq3sj06oKfMBSfphW3HDmk/t4ObvbOk/JA/swGR0LNqMksAh/f7gpTROg==", + "path": "runtime.native.system.net.http/4.3.0", + "hashPath": "runtime.native.system.net.http.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DloMk88juo0OuOWr56QG7MNchmafTLYWvABy36izkrLI5VledI0rq28KGs1i9wbpeT9NPQrx/wTf8U2vazqQ3Q==", + "path": "runtime.native.system.security.cryptography.apple/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512" + }, + "runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-NS1U+700m4KFRHR5o4vo9DSlTmlCKu/u7dtE5sUHVIPB+xpXxYQvgBgA6wEIeCz6Yfn0Z52/72WYsToCEPJnrw==", + "path": "runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.13.2-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-zWLOQ77Y4FV/6Vw2g+FYzprbQX5/xKvjoCLe4L9159Aw1bSboQoJ1KRZFNdexDooWRAIsLSdE0ZokkrVkwN8Yw==", + "path": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.13.2-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.opensuse.42.1-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KeLz4HClKf+nFS7p/6Fi/CqyLXh81FpiGzcmuS8DGi9lUqSnZ6Es23/gv2O+1XVGfrbNmviF7CckBpavkBoIFQ==", + "path": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.opensuse.42.1-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.Apple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kVXCuMTrTlxq4XOOMAysuNwsXWpYeboGddNGpIgNSZmv1b6r/s/DPk0fYMB7Q5Qo4bY68o48jt4T4y5BVecbCQ==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.apple.4.3.0.nupkg.sha512" + }, + "runtime.osx.10.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/p8IQT2brFMDa7BHMH71LV+w5Tb3OxoLHxhn6+MGqN5xeqhM2HRHmj+7xQGJnaRn73d7ZTvp6yRCFMvolws4wA==", + "path": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.osx.10.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.rhel.7-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-T5NvFgmHX0WH4c7lP72krsnk+IJI10vJf2j2twGE+5QBRA4RyRAgD+ZjEgdmpLOjW4B+nZGaadewTCUcR899OQ==", + "path": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.rhel.7-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.14.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JGc0pAWRE8lB4Ucygk2pYSKbUPLlAIq6Bczf5/WF2D/VKJEPtYlVUMxk8fbl1zRfTWzSHi+VcFZlaPlWiNxeKg==", + "path": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.14.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.04-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YWzJvhiC+iLWI/IfpPQUIBhYnAHUFQFRDqR7VDNmPj0b3rjW7dArFqKysZ9v0iSBs9Ih4v9GasLpYCSUwADMQQ==", + "path": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.04-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.ubuntu.16.10-x64.runtime.native.System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1uVTITQP8/cI6YoO6FqfW1pzP0k2TnDZ3TFD88Bu/9H7ZuTsMY9xmadbGpwPu8w8swcd1ifZJsjD9hF9O6C/tg==", + "path": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl/4.3.0", + "hashPath": "runtime.ubuntu.16.10-x64.runtime.native.system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "runtime.win-x86.Microsoft.NETCore.App/2.1.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1cIhPLl6boIYYyVADtWSVGDgLJtdT5aHo7oeDC9deyv82gx5pMowsAiV9tQ2losj7Xax3rLlbyNh6UOte+PYtg==", + "path": "runtime.win-x86.microsoft.netcore.app/2.1.12", + "hashPath": "runtime.win-x86.microsoft.netcore.app.2.1.12.nupkg.sha512" + }, + "runtime.win-x86.Microsoft.NETCore.DotNetAppHost/2.1.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-pxXLkvYvM6xjZbILQ9NmfZxLgUm5m8F/xKCiCYURZ8D47ErPv5bQMtFsqUwD3pHD2HuFI90zNghjooRL7qYe3A==", + "path": "runtime.win-x86.microsoft.netcore.dotnetapphost/2.1.12", + "hashPath": "runtime.win-x86.microsoft.netcore.dotnetapphost.2.1.12.nupkg.sha512" + }, + "runtime.win-x86.Microsoft.NETCore.DotNetHostPolicy/2.1.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Z1y5bKz9AQbzSiLqQarlBHLkTHVJp6GIS1q22XwatLyXptEoriJgmeNPcVbzRe6h5A5szGGvF/T0uwa4+LVgRQ==", + "path": "runtime.win-x86.microsoft.netcore.dotnethostpolicy/2.1.12", + "hashPath": "runtime.win-x86.microsoft.netcore.dotnethostpolicy.2.1.12.nupkg.sha512" + }, + "runtime.win-x86.Microsoft.NETCore.DotNetHostResolver/2.1.12": { + "type": "package", + "serviceable": true, + "sha512": "sha512-evcWAugroTr6ckGN+s0fYdY3j36+su1KTaCoo9GcTWZ3m9+XzHcyOfndLZRpY/YG4DxFN6DtTNy2ULPDLlr/jw==", + "path": "runtime.win-x86.microsoft.netcore.dotnethostresolver/2.1.12", + "hashPath": "runtime.win-x86.microsoft.netcore.dotnethostresolver.2.1.12.nupkg.sha512" + }, + "System.AppContext/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-fKC+rmaLfeIzUhagxY17Q9siv/sPrjjKcfNg1Ic8IlQkZLipo8ljcaZQu4VtI4Jqbzjc2VTjzGLF6WmsRXAEgA==", + "path": "system.appcontext/4.3.0", + "hashPath": "system.appcontext.4.3.0.nupkg.sha512" + }, + "System.Buffers/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ratu44uTIHgeBeI0dE8DWvmXVBSo4u7ozRZZHOMmK/JPpYyo0dAfgSiHlpiObMQ5lEtEyIXA40sKRYg5J6A8uQ==", + "path": "system.buffers/4.3.0", + "hashPath": "system.buffers.4.3.0.nupkg.sha512" + }, + "System.Collections/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3Dcj85/TBdVpL5Zr+gEEBUuFe2icOnLalmEh9hfck1PTYbbyWuZgh4fmm2ysCLTrqLQw6t3TgTyJ+VLp+Qb+Lw==", + "path": "system.collections/4.3.0", + "hashPath": "system.collections.4.3.0.nupkg.sha512" + }, + "System.Collections.Concurrent/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ztl69Xp0Y/UXCL+3v3tEU+lIy+bvjKNUmopn1wep/a291pVPK7dxBd6T7WnlQqRog+d1a/hSsgRsmFnIBKTPLQ==", + "path": "system.collections.concurrent/4.3.0", + "hashPath": "system.collections.concurrent.4.3.0.nupkg.sha512" + }, + "System.Collections.Immutable/1.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-EXKiDFsChZW0RjrZ4FYHu9aW6+P4MCgEDCklsVseRfhoO0F+dXeMSsMRAlVXIo06kGJ/zv+2w1a2uc2+kxxSaQ==", + "path": "system.collections.immutable/1.5.0", + "hashPath": "system.collections.immutable.1.5.0.nupkg.sha512" + }, + "System.ComponentModel.Annotations/4.5.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UxYQ3FGUOtzJ7LfSdnYSFd7+oEv6M8NgUatatIN2HxNtDdlcvFAf+VIq4Of9cDMJEJC0aSRv/x898RYhB4Yppg==", + "path": "system.componentmodel.annotations/4.5.0", + "hashPath": "system.componentmodel.annotations.4.5.0.nupkg.sha512" + }, + "System.Console/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-DHDrIxiqk1h03m6khKWV2X8p/uvN79rgSqpilL6uzpmSfxfU5ng8VcPtW4qsDsQDHiTv6IPV9TmD5M/vElPNLg==", + "path": "system.console/4.3.0", + "hashPath": "system.console.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Debug/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-ZUhUOdqmaG5Jk3Xdb8xi5kIyQYAA4PnTNlHx1mu9ZY3qv4ELIdKbnL/akbGaKi2RnNUWaZsAs31rvzFdewTj2g==", + "path": "system.diagnostics.debug/4.3.0", + "hashPath": "system.diagnostics.debug.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.FileVersionInfo/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-omCF64wzQ3Q2CeIqkD6lmmxeMZtGHUmzgFMPjfVaOsyqpR66p/JaZzManMw1s33osoAb5gqpncsjie67+yUPHQ==", + "path": "system.diagnostics.fileversioninfo/4.3.0", + "hashPath": "system.diagnostics.fileversioninfo.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.StackTrace/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiHg0vgtd35/DM9jvtaC1eKRpWZxr0gcQd643ABG7GnvSlf5pOkY2uyd42mMOJoOmKvnpNj0F4tuoS1pacTwYw==", + "path": "system.diagnostics.stacktrace/4.3.0", + "hashPath": "system.diagnostics.stacktrace.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Tools/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-UUvkJfSYJMM6x527dJg2VyWPSRqIVB0Z7dbjHst1zmwTXz5CcXSYJFWRpuigfbO1Lf7yfZiIaEUesfnl/g5EyA==", + "path": "system.diagnostics.tools/4.3.0", + "hashPath": "system.diagnostics.tools.4.3.0.nupkg.sha512" + }, + "System.Diagnostics.Tracing/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rswfv0f/Cqkh78rA5S8eN8Neocz234+emGCtTF3lxPY96F+mmmUen6tbn0glN6PMvlKQb9bPAY5e9u7fgPTkKw==", + "path": "system.diagnostics.tracing/4.3.0", + "hashPath": "system.diagnostics.tracing.4.3.0.nupkg.sha512" + }, + "System.Dynamic.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-SNVi1E/vfWUAs/WYKhE9+qlS6KqK0YVhnlT0HQtr8pMIA8YX3lwy3uPMownDwdYISBdmAF/2holEIldVp85Wag==", + "path": "system.dynamic.runtime/4.3.0", + "hashPath": "system.dynamic.runtime.4.3.0.nupkg.sha512" + }, + "System.Globalization/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-kYdVd2f2PAdFGblzFswE4hkNANJBKRmsfa2X5LG2AcWE1c7/4t0pYae1L8vfZ5xvE2nK/R9JprtToA61OSHWIg==", + "path": "system.globalization/4.3.0", + "hashPath": "system.globalization.4.3.0.nupkg.sha512" + }, + "System.Globalization.Calendars/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GUlBtdOWT4LTV3I+9/PJW+56AnnChTaOqqTLFtdmype/L500M2LIyXgmtd9X2P2VOkmJd5c67H5SaC2QcL1bFA==", + "path": "system.globalization.calendars/4.3.0", + "hashPath": "system.globalization.calendars.4.3.0.nupkg.sha512" + }, + "System.IO/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", + "path": "system.io/4.3.0", + "hashPath": "system.io.4.3.0.nupkg.sha512" + }, + "System.IO.Compression/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YHndyoiV90iu4iKG115ibkhrG+S3jBm8Ap9OwoUAzO5oPDAWcr0SFwQFm0HjM8WkEZWo0zvLTyLmbvTkW1bXgg==", + "path": "system.io.compression/4.3.0", + "hashPath": "system.io.compression.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-3wEMARTnuio+ulnvi+hkRNROYwa1kylvYahhcLk4HSoVdl+xxTFVeVlYOfLwrDPImGls0mDqbMhrza8qnWPTdA==", + "path": "system.io.filesystem/4.3.0", + "hashPath": "system.io.filesystem.4.3.0.nupkg.sha512" + }, + "System.IO.FileSystem.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6QOb2XFLch7bEc4lIcJH49nJN2HV+OC3fHDgsLVsBVBk3Y4hFAnOBGzJ2lUu7CyDDFo9IBWkSsnbkT6IBwwiMw==", + "path": "system.io.filesystem.primitives/4.3.0", + "hashPath": "system.io.filesystem.primitives.4.3.0.nupkg.sha512" + }, + "System.Linq/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5DbqIUpsDp0dFftytzuMmc0oeMdQwjcP/EWxsksIz/w1TcFRkZ3yKKz0PqiYFMmEwPSWw+qNVqD7PJ889JzHbw==", + "path": "system.linq/4.3.0", + "hashPath": "system.linq.4.3.0.nupkg.sha512" + }, + "System.Linq.Expressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-PGKkrd2khG4CnlyJwxwwaWWiSiWFNBGlgXvJpeO0xCXrZ89ODrQ6tjEWS/kOqZ8GwEOUATtKtzp1eRgmYNfclg==", + "path": "system.linq.expressions/4.3.0", + "hashPath": "system.linq.expressions.4.3.0.nupkg.sha512" + }, + "System.Memory/4.5.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-sDJYJpGtTgx+23Ayu5euxG5mAXWdkDb4+b0rD0Cab0M1oQS9H0HXGPriKcqpXuiJDTV7fTp/d+fMDJmnr6sNvA==", + "path": "system.memory/4.5.1", + "hashPath": "system.memory.4.5.1.nupkg.sha512" + }, + "System.ObjectModel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-bdX+80eKv9bN6K4N+d77OankKHGn6CH711a6fcOpMQu2Fckp/Ft4L/kW9WznHpyR0NRAvJutzOMHNNlBGvxQzQ==", + "path": "system.objectmodel/4.3.0", + "hashPath": "system.objectmodel.4.3.0.nupkg.sha512" + }, + "System.Reflection/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", + "path": "system.reflection/4.3.0", + "hashPath": "system.reflection.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-228FG0jLcIwTVJyz8CLFKueVqQK36ANazUManGaJHkO0icjiIypKW7YLWLIWahyIkdh5M7mV2dJepllLyA1SKg==", + "path": "system.reflection.emit/4.3.0", + "hashPath": "system.reflection.emit.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit.ILGeneration/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-59tBslAk9733NXLrUJrwNZEzbMAcu8k344OYo+wfSVygcgZ9lgBdGIzH/nrg3LYhXceynyvTc8t5/GD4Ri0/ng==", + "path": "system.reflection.emit.ilgeneration/4.3.0", + "hashPath": "system.reflection.emit.ilgeneration.4.3.0.nupkg.sha512" + }, + "System.Reflection.Emit.Lightweight/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-oadVHGSMsTmZsAF864QYN1t1QzZjIcuKU3l2S9cZOwDdDueNTrqq1yRj7koFfIGEnKpt6NjpL3rOzRhs4ryOgA==", + "path": "system.reflection.emit.lightweight/4.3.0", + "hashPath": "system.reflection.emit.lightweight.4.3.0.nupkg.sha512" + }, + "System.Reflection.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-rJkrJD3kBI5B712aRu4DpSIiHRtr6QlfZSQsb0hYHrDCZORXCFjQfoipo2LaMUHoT9i1B7j7MnfaEKWDFmFQNQ==", + "path": "system.reflection.extensions/4.3.0", + "hashPath": "system.reflection.extensions.4.3.0.nupkg.sha512" + }, + "System.Reflection.Metadata/1.6.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==", + "path": "system.reflection.metadata/1.6.0", + "hashPath": "system.reflection.metadata.1.6.0.nupkg.sha512" + }, + "System.Reflection.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", + "path": "system.reflection.primitives/4.3.0", + "hashPath": "system.reflection.primitives.4.3.0.nupkg.sha512" + }, + "System.Reflection.TypeExtensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7u6ulLcZbyxB5Gq0nMkQttcdBTx57ibzw+4IOXEfR+sXYQoHvjW5LTLyNr8O22UIMrqYbchJQJnos4eooYzYJA==", + "path": "system.reflection.typeextensions/4.3.0", + "hashPath": "system.reflection.typeextensions.4.3.0.nupkg.sha512" + }, + "System.Resources.ResourceManager/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-/zrcPkkWdZmI4F92gL/TPumP98AVDu/Wxr3CSJGQQ+XN6wbRZcyfSKVoPo17ilb3iOr0cCRqJInGwNMolqhS8A==", + "path": "system.resources.resourcemanager/4.3.0", + "hashPath": "system.resources.resourcemanager.4.3.0.nupkg.sha512" + }, + "System.Runtime/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "path": "system.runtime/4.3.0", + "hashPath": "system.runtime.4.3.0.nupkg.sha512" + }, + "System.Runtime.CompilerServices.Unsafe/4.5.1": { + "type": "package", + "serviceable": true, + "sha512": "sha512-Zh8t8oqolRaFa9vmOZfdQm/qKejdqz0J9kr7o2Fu0vPeoH3BL1EOXipKWwkWtLT1JPzjByrF19fGuFlNbmPpiw==", + "path": "system.runtime.compilerservices.unsafe/4.5.1", + "hashPath": "system.runtime.compilerservices.unsafe.4.5.1.nupkg.sha512" + }, + "System.Runtime.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-guW0uK0fn5fcJJ1tJVXYd7/1h5F+pea1r7FLSOz/f8vPEqbR2ZAknuRDvTQ8PzAilDveOxNjSfr0CHfIQfFk8g==", + "path": "system.runtime.extensions/4.3.0", + "hashPath": "system.runtime.extensions.4.3.0.nupkg.sha512" + }, + "System.Runtime.Handles/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OKiSUN7DmTWeYb3l51A7EYaeNMnvxwE249YtZz7yooT4gOZhmTjIn48KgSsw2k2lYdLgTKNJw/ZIfSElwDRVgg==", + "path": "system.runtime.handles/4.3.0", + "hashPath": "system.runtime.handles.4.3.0.nupkg.sha512" + }, + "System.Runtime.InteropServices/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-uv1ynXqiMK8mp1GM3jDqPCFN66eJ5w5XNomaK2XD+TuCroNTLFGeZ+WCmBMcBDyTFKou3P6cR6J/QsaqDp7fGQ==", + "path": "system.runtime.interopservices/4.3.0", + "hashPath": "system.runtime.interopservices.4.3.0.nupkg.sha512" + }, + "System.Runtime.Numerics/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-yMH+MfdzHjy17l2KESnPiF2dwq7T+xLnSJar7slyimAkUh/gTrS9/UQOtv7xarskJ2/XDSNvfLGOBQPjL7PaHQ==", + "path": "system.runtime.numerics/4.3.0", + "hashPath": "system.runtime.numerics.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Algorithms/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-W1kd2Y8mYSCgc3ULTAZ0hOP2dSdG5YauTb1089T0/kRcN2MpSAW1izOFROrJgxSlMn3ArsgHXagigyi+ibhevg==", + "path": "system.security.cryptography.algorithms/4.3.0", + "hashPath": "system.security.cryptography.algorithms.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Cng/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-03idZOqFlsKRL4W+LuCpJ6dBYDUWReug6lZjBa3uJWnk5sPCUXckocevTaUA8iT/MFSrY/2HXkOt753xQ/cf8g==", + "path": "system.security.cryptography.cng/4.3.0", + "hashPath": "system.security.cryptography.cng.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Csp/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-X4s/FCkEUnRGnwR3aSfVIkldBmtURMhmexALNTwpjklzxWU7yjMk7GHLKOZTNkgnWnE0q7+BCf9N2LVRWxewaA==", + "path": "system.security.cryptography.csp/4.3.0", + "hashPath": "system.security.cryptography.csp.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-1DEWjZZly9ae9C79vFwqaO5kaOlI5q+3/55ohmq/7dpDyDfc8lYe7YVxJUZ5MF/NtbkRjwFRo14yM4OEo9EmDw==", + "path": "system.security.cryptography.encoding/4.3.0", + "hashPath": "system.security.cryptography.encoding.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.OpenSsl/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-vOYy7Jv9KsG3ld2hLt0GoERd82SZi4BelrbXLwI9yFBYX7kpbvUCWYo4eyevk47cuJXZ9ZLVAryANcc7iY71aA==", + "path": "system.security.cryptography.openssl/4.3.0", + "hashPath": "system.security.cryptography.openssl.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.Primitives/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-7bDIyVFNL/xKeFHjhobUAQqSpJq9YTOpbEs6mR233Et01STBMXNAc/V+BM6dwYGc95gVh/Zf+iVXWzj3mE8DWg==", + "path": "system.security.cryptography.primitives/4.3.0", + "hashPath": "system.security.cryptography.primitives.4.3.0.nupkg.sha512" + }, + "System.Security.Cryptography.X509Certificates/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-t2Tmu6Y2NtJ2um0RtcuhP7ZdNNxXEgUm2JeoA/0NvlMjAhKCnM1NX07TDl3244mVp3QU6LPEhT3HTtH1uF7IYw==", + "path": "system.security.cryptography.x509certificates/4.3.0", + "hashPath": "system.security.cryptography.x509certificates.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", + "path": "system.text.encoding/4.3.0", + "hashPath": "system.text.encoding.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding.CodePages/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-6ENnyNU7cdmUVYblQ9GzLuJlLs9HWyoSInm+JZyCBHFUTaSQZolLIdGSZWGw5VOhjbFop+u/pU0AbKiHQKheqw==", + "path": "system.text.encoding.codepages/4.3.0", + "hashPath": "system.text.encoding.codepages.4.3.0.nupkg.sha512" + }, + "System.Text.Encoding.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-YVMK0Bt/A43RmwizJoZ22ei2nmrhobgeiYwFzC4YAN+nue8RF6djXDMog0UCn+brerQoYVyaS+ghy9P/MUVcmw==", + "path": "system.text.encoding.extensions/4.3.0", + "hashPath": "system.text.encoding.extensions.4.3.0.nupkg.sha512" + }, + "System.Text.RegularExpressions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-RpT2DA+L660cBt1FssIE9CAGpLFdFPuheB7pLpKpn6ZXNby7jDERe8Ua/Ne2xGiwLVG2JOqziiaVCGDon5sKFA==", + "path": "system.text.regularexpressions/4.3.0", + "hashPath": "system.text.regularexpressions.4.3.0.nupkg.sha512" + }, + "System.Threading/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-VkUS0kOBcUf3Wwm0TSbrevDDZ6BlM+b/HRiapRFWjM5O0NS0LviG0glKmFK+hhPDd1XFeSdU1GmlLhb2CoVpIw==", + "path": "system.threading/4.3.0", + "hashPath": "system.threading.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", + "path": "system.threading.tasks/4.3.0", + "hashPath": "system.threading.tasks.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks.Extensions/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-npvJkVKl5rKXrtl1Kkm6OhOUaYGEiF9wFbppFRWSMoApKzt2PiPHT2Bb8a5sAWxprvdOAtvaARS9QYMznEUtug==", + "path": "system.threading.tasks.extensions/4.3.0", + "hashPath": "system.threading.tasks.extensions.4.3.0.nupkg.sha512" + }, + "System.Threading.Tasks.Parallel/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cbjBNZHf/vQCfcdhzx7knsiygoCKgxL8mZOeocXZn5gWhCdzHIq6bYNKWX0LAJCWYP7bds4yBK8p06YkP0oa0g==", + "path": "system.threading.tasks.parallel/4.3.0", + "hashPath": "system.threading.tasks.parallel.4.3.0.nupkg.sha512" + }, + "System.Threading.Thread/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-OHmbT+Zz065NKII/ZHcH9XO1dEuLGI1L2k7uYss+9C1jLxTC9kTZZuzUOyXHayRk+dft9CiDf3I/QZ0t8JKyBQ==", + "path": "system.threading.thread/4.3.0", + "hashPath": "system.threading.thread.4.3.0.nupkg.sha512" + }, + "System.ValueTuple/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-cNLEvBX3d6MMQRZe3SMFNukVbitDAEpVZO17qa0/2FHxZ7Y7PpFRpr6m2615XYM/tYYYf0B+WyHNujqIw8Luwg==", + "path": "system.valuetuple/4.3.0", + "hashPath": "system.valuetuple.4.3.0.nupkg.sha512" + }, + "System.Xml.ReaderWriter/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-GrprA+Z0RUXaR4N7/eW71j1rgMnEnEVlgii49GZyAjTH7uliMnrOU3HNFBr6fEDBCJCIdlVNq9hHbaDR621XBA==", + "path": "system.xml.readerwriter/4.3.0", + "hashPath": "system.xml.readerwriter.4.3.0.nupkg.sha512" + }, + "System.Xml.XDocument/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-5zJ0XDxAIg8iy+t4aMnQAu0MqVbqyvfoUVl1yDV61xdo3Vth45oA2FoY4pPkxYAH5f8ixpmTqXeEIya95x0aCQ==", + "path": "system.xml.xdocument/4.3.0", + "hashPath": "system.xml.xdocument.4.3.0.nupkg.sha512" + }, + "System.Xml.XmlDocument/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-lJ8AxvkX7GQxpC6GFCeBj8ThYVyQczx2+f/cWHJU8tjS7YfI6Cv6bon70jVEgs2CiFbmmM8b9j1oZVx0dSI2Ww==", + "path": "system.xml.xmldocument/4.3.0", + "hashPath": "system.xml.xmldocument.4.3.0.nupkg.sha512" + }, + "System.Xml.XPath/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-v1JQ5SETnQusqmS3RwStF7vwQ3L02imIzl++sewmt23VGygix04pEH+FCj1yWb+z4GDzKiljr1W7Wfvrx0YwgA==", + "path": "system.xml.xpath/4.3.0", + "hashPath": "system.xml.xpath.4.3.0.nupkg.sha512" + }, + "System.Xml.XPath.XDocument/4.3.0": { + "type": "package", + "serviceable": true, + "sha512": "sha512-jw9oHHEIVW53mHY9PgrQa98Xo2IZ0ZjrpdOTmtvk+Rvg4tq7dydmxdNqUvJ5YwjDqhn75mBXWttWjiKhWP53LQ==", + "path": "system.xml.xpath.xdocument/4.3.0", + "hashPath": "system.xml.xpath.xdocument.4.3.0.nupkg.sha512" + }, + "Capnp.Net.Runtime/1.0.0": { + "type": "project", + "serviceable": false, + "sha512": "" + } + } +} \ No newline at end of file diff --git a/chocolatey/deploy/capnpc-csharp.runtimeconfig.json b/chocolatey/deploy/capnpc-csharp.runtimeconfig.json new file mode 100644 index 0000000..153e1cf --- /dev/null +++ b/chocolatey/deploy/capnpc-csharp.runtimeconfig.json @@ -0,0 +1,3 @@ +{ + "runtimeOptions": {} +} \ No newline at end of file diff --git a/scripts/capnpc-csharp-install-win-x86.ps1 b/scripts/capnpc-csharp-install-win-x86.ps1 new file mode 100644 index 0000000..9d85b58 --- /dev/null +++ b/scripts/capnpc-csharp-install-win-x86.ps1 @@ -0,0 +1,8 @@ +$id = "capnpc-csharp-win-x86" + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$installDir = "$scriptDir\..\chocolatey\install" + +if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit } + +choco install $id -s $installDir --force diff --git a/scripts/capnpc-csharp-install.ps1 b/scripts/capnpc-csharp-install.ps1 new file mode 100644 index 0000000..cb04d34 --- /dev/null +++ b/scripts/capnpc-csharp-install.ps1 @@ -0,0 +1,8 @@ +$id = "capnpc-csharp" + +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$installDir = "$scriptDir\..\chocolatey\install" + +if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; exit } + +choco install $id -s $installDir --force diff --git a/scripts/capnpc-csharp-pack.ps1 b/scripts/capnpc-csharp-pack.ps1 new file mode 100644 index 0000000..7ecb46a --- /dev/null +++ b/scripts/capnpc-csharp-pack.ps1 @@ -0,0 +1,12 @@ +$id = "capnpc-csharp" +$id_win_x86 = "capnpc-csharp-win-x86" +$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path +$chocoDir = "$scriptDir\..\chocolatey" +$csprojDir = "$scriptDir\..\capnpc-csharp" +$csprojFile = "capnpc-csharp.csproj" + +dotnet publish -c Release -r win-x86 --self-contained -o "$chocoDir\$id_win_x86\bin" "$csprojDir\$csprojFile" +dotnet publish -c Release -o "$chocoDir\$id\bin" "$csprojDir\$csprojFile" + +choco pack "$chocoDir\$id\$id.nuspec" --outputdirectory "$chocoDir\$id\bin" +choco pack "$chocoDir\$id_win_x86\$id_win_x86.nuspec" --outputdirectory "$chocoDir\$id_win_x86\bin"