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"