diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index 80c4970a..71796505 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -34,8 +34,8 @@ jobs: run: dotnet build src/NetMQ.sln /p:Configuration=Release /verbosity:minimal - name: test net9.0 run: dotnet test -v n -p:ParallelizeTestCollections=false --configuration Release --no-build -f net9.0 src\NetMQ.Tests\NetMQ.Tests.csproj - - name: test net47 - run: dotnet test -v n -p:ParallelizeTestCollections=false --configuration Release --no-build -f net47 src\NetMQ.Tests\NetMQ.Tests.csproj + - name: test net472 + run: dotnet test -v n -p:ParallelizeTestCollections=false --configuration Release --no-build -f net472 src\NetMQ.Tests\NetMQ.Tests.csproj - name: coverage run: | OpenCover.Console.exe -register:user -target:"C:\Program Files\dotnet\dotnet.exe" -targetargs:"test --no-build --configuration Release -f net6.0 --logger:trx;LogFileName=results.trx /p:DebugType=full src\NetMQ.Tests\NetMQ.Tests.csproj" -filter:"+[NetMQ*]* -[NetMQ.Tests*]*" -output:".\NetMQ_coverage.xml" -oldStyle diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index bc93f20f..00000000 --- a/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: csharp -mono: none -dotnet: 3.1 - -addons: - apt: - packages: - - dotnet-sdk-2.2 - - -script: - - dotnet restore src/NetMQ.sln - - dotnet build -v q -f netstandard2.0 src/NetMQ/NetMQ.csproj - - dotnet test -v n --logger "Console;noprogress=true" -p:ParallelizeTestCollections=false -f netcoreapp2.1 --filter Category!=Beacon src/NetMQ.Tests/NetMQ.Tests.csproj -- RunConfiguration.ReporterSwitch=verbose - diff --git a/src/NetMQ.Tests/ClientServer.cs b/src/NetMQ.Tests/ClientServer.cs index 8fad5621..b9c651ea 100644 --- a/src/NetMQ.Tests/ClientServer.cs +++ b/src/NetMQ.Tests/ClientServer.cs @@ -54,7 +54,7 @@ public void Tcp() } [Fact] - public async void Async() + public async Task Async() { using var server = new ServerSocket(); using var client = new ClientSocket(); @@ -72,7 +72,7 @@ public async void Async() } [Fact] - public async void AsyncWithCancellationToken() + public async Task AsyncWithCancellationToken() { using CancellationTokenSource source = new CancellationTokenSource(); using var server = new ServerSocket(); diff --git a/src/NetMQ.Tests/CurveTests.cs b/src/NetMQ.Tests/CurveTests.cs index 7d991aba..202d987b 100644 --- a/src/NetMQ.Tests/CurveTests.cs +++ b/src/NetMQ.Tests/CurveTests.cs @@ -2,7 +2,7 @@ using NetMQ.Sockets; using Xunit; -#if NET47 +#if NETFRAMEWORK using ZeroMQ; #endif @@ -39,7 +39,7 @@ public void CurveTest() } -#if NET47 +#if NETFRAMEWORK [Fact] public void WithLibzmqClient() { diff --git a/src/NetMQ.Tests/MessageTests.cs b/src/NetMQ.Tests/MessageTests.cs index 2009f8f9..3ea05d47 100644 --- a/src/NetMQ.Tests/MessageTests.cs +++ b/src/NetMQ.Tests/MessageTests.cs @@ -128,7 +128,7 @@ public void Issue52_ReqToRouterBug() var msg = router.ReceiveMultipartMessage(); Assert.Equal(3, msg.FrameCount); - Assert.Equal(msg[2].ConvertToString(), testmessage); + Assert.Equal(testmessage, msg[2].ConvertToString()); } } diff --git a/src/NetMQ.Tests/NetMQ.Tests.csproj b/src/NetMQ.Tests/NetMQ.Tests.csproj index 7f412ea6..59193dee 100644 --- a/src/NetMQ.Tests/NetMQ.Tests.csproj +++ b/src/NetMQ.Tests/NetMQ.Tests.csproj @@ -7,7 +7,7 @@ true true true - net9.0;net47 + net9.0;net472 @@ -20,13 +20,13 @@ /usr/lib/mono /usr/local/lib/mono - $(BaseFrameworkPathOverrideForMono)/4.7-api + $(BaseFrameworkPathOverrideForMono)/4.7-api $(FrameworkPathOverride)/Facades;$(AssemblySearchPaths) - + @@ -39,14 +39,17 @@ - + - - - + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - + diff --git a/src/NetMQ.Tests/NetMQMonitorTests.cs b/src/NetMQ.Tests/NetMQMonitorTests.cs index e6665e0b..81eb0d1d 100644 --- a/src/NetMQ.Tests/NetMQMonitorTests.cs +++ b/src/NetMQ.Tests/NetMQMonitorTests.cs @@ -57,9 +57,9 @@ public void Monitoring() } } -#if !NET35 + [Fact] - public void StartAsync() + public async Task StartAsync() { using (var rep = new ResponseSocket()) using (var monitor = new NetMQMonitor(rep, "inproc://foo", SocketEvents.Closed)) @@ -68,10 +68,11 @@ public void StartAsync() Thread.Sleep(200); Assert.Equal(TaskStatus.Running, task.Status); monitor.Stop(); - Assert.True(task.Wait(TimeSpan.FromMilliseconds(1000))); + var completedTask = await Task.WhenAny(task, Task.Delay(1000)); + Assert.Equal(task, completedTask); } } -#endif + [Fact] public void NoHangWhenMonitoringUnboundInprocAddress() @@ -126,7 +127,7 @@ public void ErrorCodeTest() } [Fact] - public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket() + public async Task MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket() { // The bug: // Given we monitor a netmq tcp socket @@ -141,7 +142,7 @@ public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket() using (var req = new RequestSocket()) { monitor = new NetMQMonitor(req, "inproc://#monitor", SocketEvents.All); - Task.Factory.StartNew(monitor.Start); + _ = Task.Factory.StartNew(monitor.Start); // Bug only occurs when monitoring a tcp socket var port = res.BindRandomPort("tcp://127.0.0.1"); @@ -152,10 +153,12 @@ public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket() res.SendFrame("response"); Assert.Equal("response", req.ReceiveFrameString()); } - Thread.Sleep(100); + + await Task.Delay(100); // Monitor.Dispose should complete - var completed = Task.Factory.StartNew(() => monitor.Dispose()).Wait(1000); - Assert.True(completed); + var task = Task.Factory.StartNew(() => monitor.Dispose()); + var completedTask = await Task.WhenAny(task, Task.Delay(1000)); + Assert.Equal(task, completedTask); } // NOTE If this test fails, it will hang because context.Dispose will block } diff --git a/src/NetMQ.Tests/NetMQPollerTest.cs b/src/NetMQ.Tests/NetMQPollerTest.cs index f4903073..6839eaf2 100644 --- a/src/NetMQ.Tests/NetMQPollerTest.cs +++ b/src/NetMQ.Tests/NetMQPollerTest.cs @@ -10,6 +10,7 @@ #if !NET35 using System.Collections.Concurrent; +using System.Collections.Generic; #endif // ReSharper disable AccessToDisposedClosure @@ -318,7 +319,7 @@ public void AddTwoSocketAfterRemoving() [Fact] - public void RemoveSocket() + public async Task RemoveSocket() { using (var router1 = new RouterSocket()) using (var router2 = new RouterSocket()) @@ -395,8 +396,8 @@ public void RemoveSocket() poller.Stop(); // await the pollerTask, 1ms should suffice - pollerTask.Wait(1); - Assert.True(pollerTask.IsCompleted); + var completedTask = await Task.WhenAny(pollerTask, Task.Delay(1)); + Assert.Equal(pollerTask, completedTask); } } @@ -865,7 +866,7 @@ public void NativeSocket() #if !NET35 [Fact] - public void OneTask() + public async Task OneTask() { bool triggered = false; @@ -879,14 +880,14 @@ public void OneTask() Assert.True(poller.CanExecuteTaskInline, "Should be on NetMQPoller thread"); }); task.Start(poller); - task.Wait(); + await task; Assert.True(triggered); } } [Fact] - public void SetsCurrentTaskScheduler() + public async Task SetsCurrentTaskScheduler() { using (var poller = new NetMQPoller()) { @@ -894,12 +895,12 @@ public void SetsCurrentTaskScheduler() var task = new Task(() => Assert.Same(TaskScheduler.Current, poller)); task.Start(poller); - task.Wait(); + await task; } } [Fact] - public void CanExecuteTaskInline() + public async Task CanExecuteTaskInline() { using (var poller = new NetMQPoller()) { @@ -911,12 +912,12 @@ public void CanExecuteTaskInline() var task = new Task(() => Assert.True(poller.CanExecuteTaskInline)); task.Start(poller); - task.Wait(); + await task; } } [Fact] - public void ContinueWith() + public async Task ContinueWith() { int threadId1 = 0; int threadId2 = 1; @@ -941,8 +942,7 @@ public void ContinueWith() }, poller); task.Start(poller); - task.Wait(); - task2.Wait(); + await Task.WhenAll(new List{task, task2}); Assert.Equal(threadId1, threadId2); Assert.Equal(1, runCount1); @@ -951,7 +951,7 @@ public void ContinueWith() } [Fact] - public void TwoThreads() + public async Task TwoThreads() { int count1 = 0; int count2 = 0; @@ -982,9 +982,8 @@ public void TwoThreads() } }); - t1.Wait(1000); - t2.Wait(1000); - Task.WaitAll(allTasks.ToArray(), 1000); + await Task.WhenAny(Task.WhenAll(new List{ t1, t2 }), Task.Delay(1000)); + await Task.WhenAny(Task.WhenAll(allTasks.ToArray()), Task.Delay(1000)); Assert.Equal(100, count1); Assert.Equal(100, count2); diff --git a/src/NetMQ.Tests/NetMQQueueTests.cs b/src/NetMQ.Tests/NetMQQueueTests.cs index 9a26870d..d6d38ada 100644 --- a/src/NetMQ.Tests/NetMQQueueTests.cs +++ b/src/NetMQ.Tests/NetMQQueueTests.cs @@ -24,7 +24,7 @@ public void EnqueueDequeue() } [Fact] - public void EnqueueShouldNotBlockWhenCapacityIsZero() + public async Task EnqueueShouldNotBlockWhenCapacityIsZero() { using (var mockSocket = new PairSocket()) using (var queue = new NetMQQueue()) @@ -39,8 +39,8 @@ public void EnqueueShouldNotBlockWhenCapacityIsZero() } }); - bool completed = task.Wait(TimeSpan.FromSeconds(1)); - Assert.True(completed, "Enqueue task should have completed " + socketWatermarkCapacity + " enqueue within 1 second"); + var completedTask = await Task.WhenAny(task, Task.Delay(1000)); + Assert.True(task == completedTask, "Enqueue task should have completed " + socketWatermarkCapacity + " enqueue within 1 second"); } } diff --git a/src/NetMQ.Tests/PgmTests.cs b/src/NetMQ.Tests/PgmTests.cs index 1dcc857e..bf216679 100644 --- a/src/NetMQ.Tests/PgmTests.cs +++ b/src/NetMQ.Tests/PgmTests.cs @@ -187,7 +187,7 @@ public void TwoPublishers() } [Fact(Skip = "Requires MSMQ for PGM sockets")] - public void Sending1000Messages() + public async Task Sending1000Messages() { // creating two different context and sending 1000 messages @@ -230,8 +230,8 @@ public void Sending1000Messages() } }); - pubTask.Wait(); - subTask.Wait(); + await pubTask; + await subTask; Assert.Equal(1000, count); } @@ -266,7 +266,7 @@ public void LargeMessage() [Theory(Skip = "Requires MSMQ for PGM sockets")] [InlineData("pgm://239.0.0.1:1000")] [InlineData("tcp://localhost:60000")] - public void SubscriberCleanupOnUnbind(string address) + public async Task SubscriberCleanupOnUnbind(string address) { for (var i = 0; i < 10; i++) { @@ -290,8 +290,8 @@ public void SubscriberCleanupOnUnbind(string address) // var duration = DateTime.Now - time; monitor.Stop(); - - monitorTask.Wait(); + + await monitorTask; } } } diff --git a/src/NetMQ.Tests/RadioDish.cs b/src/NetMQ.Tests/RadioDish.cs index 676f85d4..0c0a77e3 100644 --- a/src/NetMQ.Tests/RadioDish.cs +++ b/src/NetMQ.Tests/RadioDish.cs @@ -1,5 +1,6 @@ using System; using System.Threading; +using System.Threading.Tasks; using NetMQ.Sockets; using Xunit; using Xunit.Abstractions; @@ -47,7 +48,7 @@ public void TestBlocking() } [Fact] - public async void TestAsync() + public async Task TestAsync() { using var radio = new RadioSocket(); using var dish = new DishSocket(); @@ -56,7 +57,7 @@ public async void TestAsync() int port = radio.BindRandomPort("tcp://*"); dish.Connect($"tcp://127.0.0.1:{port}"); - Thread.Sleep(100); + await Task.Delay(100); await radio.SendAsync("1", "HELLO"); await radio.SendAsync("2", "HELLO"); diff --git a/src/NetMQ.Tests/RouterTests.cs b/src/NetMQ.Tests/RouterTests.cs index 0633b6a7..a6b78e43 100644 --- a/src/NetMQ.Tests/RouterTests.cs +++ b/src/NetMQ.Tests/RouterTests.cs @@ -44,7 +44,7 @@ public void ReceiveReadyDot35Bug() using (var server = new RouterSocket()) { server.BindRandomPort("tcp://127.0.0.1"); - server.ReceiveReady += (s, e) => Assert.True(false, "Should not receive"); + server.ReceiveReady += (s, e) => Assert.Fail( "Should not receive"); Assert.False(server.Poll(TimeSpan.FromMilliseconds(1500))); } diff --git a/src/NetMQ.Tests/ScatterGather.cs b/src/NetMQ.Tests/ScatterGather.cs index 6847c596..affc82e4 100644 --- a/src/NetMQ.Tests/ScatterGather.cs +++ b/src/NetMQ.Tests/ScatterGather.cs @@ -1,4 +1,5 @@ using System.Threading; +using System.Threading.Tasks; using NetMQ.Sockets; using Xunit; @@ -47,7 +48,7 @@ public void TestBlocking() } [Fact] - public async void TestAsync() + public async Task TestAsync() { using var scatter = new ScatterSocket(); using var gather = new GatherSocket(); diff --git a/src/NetMQ.Tests/SocketTests.cs b/src/NetMQ.Tests/SocketTests.cs index 87072d62..746d97a0 100644 --- a/src/NetMQ.Tests/SocketTests.cs +++ b/src/NetMQ.Tests/SocketTests.cs @@ -92,7 +92,7 @@ public void LargeMessage() } [Fact] - public void ReceiveMessageWithTimeout() + public async Task ReceiveMessageWithTimeout() { { var pubSync = new AutoResetEvent(false); @@ -134,7 +134,7 @@ public void ReceiveMessageWithTimeout() t1.Start(); t2.Start(); - Task.WaitAll(t1, t2); + await Task.WhenAll(t1, t2); } } diff --git a/src/NetMQ.Tests/XPubSubTests.cs b/src/NetMQ.Tests/XPubSubTests.cs index 14d730e7..e7c65ab6 100644 --- a/src/NetMQ.Tests/XPubSubTests.cs +++ b/src/NetMQ.Tests/XPubSubTests.cs @@ -332,7 +332,7 @@ public void Manual() sub.SendFrame(new byte[] { 1, (byte)'A' }); var subscription = pub.ReceiveFrameBytes(); - Assert.Equal(subscription[1], (byte)'A'); + Assert.Equal((byte)'A', subscription[1]); pub.Subscribe("B"); pub.SendFrame("A"); @@ -356,7 +356,7 @@ public void WelcomeMessage() var subscription = pub.ReceiveFrameBytes(); - Assert.Equal(subscription[1], (byte)'W'); + Assert.Equal((byte)'W', subscription[1]); Assert.Equal("W", sub.ReceiveFrameString()); } @@ -377,7 +377,7 @@ public void ClearWelcomeMessage() var subscription = pub.ReceiveFrameBytes(); - Assert.Equal(subscription[1], (byte)'W'); + Assert.Equal( (byte)'W', subscription[1]); Assert.False(sub.TrySkipFrame()); } diff --git a/src/NetMQ.Tests/ZMTPTests.cs b/src/NetMQ.Tests/ZMTPTests.cs index 5efda747..d33e519d 100644 --- a/src/NetMQ.Tests/ZMTPTests.cs +++ b/src/NetMQ.Tests/ZMTPTests.cs @@ -10,7 +10,7 @@ using NetMQ.Sockets; using Xunit; -#if NET47 +#if NETFRAMEWORK using ZeroMQ; #endif @@ -156,7 +156,7 @@ public void V3Test() } } -#if NET47 +#if NETFRAMEWORK [Fact] public void WithLibzmq() { diff --git a/src/NetMQ/Annotations.cs b/src/NetMQ/Annotations.cs index 90e76165..845df150 100644 --- a/src/NetMQ/Annotations.cs +++ b/src/NetMQ/Annotations.cs @@ -1,6 +1,6 @@ // Licensed to the .NET Foundation under one or more agreements. The .NET Foundation licenses this file to you under the MIT license. See the LICENSE.md file in the project root for more information. -#if !NETSTANDARD2_1 +#if NETFRAMEWORK namespace System.Diagnostics.CodeAnalysis { diff --git a/src/NetMQ/AsyncReceiveExtensions.cs b/src/NetMQ/AsyncReceiveExtensions.cs index 10c12202..b62ffbad 100644 --- a/src/NetMQ/AsyncReceiveExtensions.cs +++ b/src/NetMQ/AsyncReceiveExtensions.cs @@ -1,5 +1,4 @@ -#if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 - + using System; using System.Collections.Generic; using System.Text; @@ -92,7 +91,7 @@ public static async Task ReceiveMultipartMessageAsync( registration = cancellationToken.Register(PropagateCancel); } - void Listener(object sender, NetMQSocketEventArgs args) + void Listener(object? sender, NetMQSocketEventArgs args) { if (socket.TryReceive(ref msg, TimeSpan.Zero)) { @@ -175,7 +174,7 @@ void PropagateCancel() registration = cancellationToken.Register(PropagateCancel); } - void Listener(object sender, NetMQSocketEventArgs args) + void Listener(object? sender, NetMQSocketEventArgs args) { if (socket.TryReceive(ref msg, TimeSpan.Zero)) { @@ -242,7 +241,7 @@ public static Task SkipFrameAsync( registration = cancellationToken.Register(PropagateCancel); } - void Listener(object sender, NetMQSocketEventArgs args) + void Listener(object? sender, NetMQSocketEventArgs args) { if (socket.TryReceive(ref msg, TimeSpan.Zero)) { @@ -308,4 +307,3 @@ public static async Task SkipMultipartMessageAsync(this NetMQSocket socket) } } -#endif diff --git a/src/NetMQ/Core/Address.cs b/src/NetMQ/Core/Address.cs index 223115bf..61cba3d0 100644 --- a/src/NetMQ/Core/Address.cs +++ b/src/NetMQ/Core/Address.cs @@ -18,6 +18,7 @@ You should have received a copy of the GNU Lesser General Public License along with this program. If not, see . */ +using System.Diagnostics; using System.Net; namespace NetMQ.Core @@ -102,7 +103,8 @@ public Address(EndPoint endpoint) return; } - AddressString = endpoint.ToString(); + Debug.Assert(endpoint != null); + AddressString = endpoint!.ToString()!; } @@ -112,9 +114,9 @@ public override string ToString() { switch (Protocol) { - case TcpProtocol: return Resolved.ToString(); - case IpcProtocol: return Resolved.ToString(); - case PgmProtocol: return Resolved.ToString(); + case TcpProtocol: return Resolved!.ToString()!; + case IpcProtocol: return Resolved!.ToString()!; + case PgmProtocol: return Resolved!.ToString()!; } } @@ -123,7 +125,7 @@ public override string ToString() return Protocol + "://" + AddressString; } - return base.ToString(); + return base.ToString()!; } public string Protocol { get; } diff --git a/src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs b/src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs index 5715952b..acdbf0f4 100644 --- a/src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs +++ b/src/NetMQ/Core/Mechanisms/CurveClientMechanism.cs @@ -189,7 +189,7 @@ PullMsgResult ProduceInitiate(ref Msg msg) VouchNoncePrefix.CopyTo(vouchNonce); using var rng = RandomNumberGenerator.Create(); -#if NETSTANDARD2_1 +#if NETSTANDARD || NET rng.GetBytes(vouchNonce.Slice(8)); #else byte[] temp = new byte[16]; diff --git a/src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs b/src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs index 1a104867..ba5069a9 100644 --- a/src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs +++ b/src/NetMQ/Core/Mechanisms/CurveServerMechanism.cs @@ -157,7 +157,7 @@ PullMsgResult ProduceWelcome(ref Msg msg) // 8-byte prefix plus 16-byte random nonce CookieNoncePrefix.CopyTo(cookieNonce); using var rng = RandomNumberGenerator.Create(); -#if NETSTANDARD2_1 +#if NETSTANDARD || NET rng.GetBytes(cookieNonce.Slice(8)); #else byte[] temp = new byte[16]; @@ -184,7 +184,7 @@ PullMsgResult ProduceWelcome(ref Msg msg) // Create full nonce for encryption // 8-byte prefix plus 16-byte random nonce WelcomeNoncePrefix.CopyTo(welcomeNonce); -#if NETSTANDARD2_1 +#if NETSTANDARD || NET rng.GetBytes(welcomeNonce.Slice(8)); #else rng.GetBytes(temp); diff --git a/src/NetMQ/Core/Patterns/Peer.cs b/src/NetMQ/Core/Patterns/Peer.cs index ef08789f..af6b87e3 100644 --- a/src/NetMQ/Core/Patterns/Peer.cs +++ b/src/NetMQ/Core/Patterns/Peer.cs @@ -148,7 +148,7 @@ protected override void XAttachPipe(Pipe pipe, bool icanhasall) /// the Pipe that is being removed protected override void XTerminated(Pipe pipe) { - m_outpipes.TryGetValue(pipe.RoutingId, out Outpipe old); + m_outpipes.TryGetValue(pipe.RoutingId, out Outpipe? old); m_outpipes.Remove(pipe.RoutingId); Debug.Assert(old != null); @@ -208,7 +208,7 @@ protected override bool XSend(ref Msg msg) // Find the pipe associated with the routingId stored in the prefix. var routingId = BitConverter.ToUInt32(msg.UnsafeToArray(), 0); - if (m_outpipes.TryGetValue(routingId, out Outpipe op)) + if (m_outpipes.TryGetValue(routingId, out Outpipe? op)) { m_currentOut = op.Pipe; if (!m_currentOut.CheckWrite()) diff --git a/src/NetMQ/Core/Patterns/Router.cs b/src/NetMQ/Core/Patterns/Router.cs index b2eac0ec..f1a2c530 100644 --- a/src/NetMQ/Core/Patterns/Router.cs +++ b/src/NetMQ/Core/Patterns/Router.cs @@ -214,7 +214,7 @@ protected override void XTerminated(Pipe pipe) { Assumes.NotNull(pipe.Identity); - m_outpipes.TryGetValue(pipe.Identity, out Outpipe old); + m_outpipes.TryGetValue(pipe.Identity, out Outpipe? old); m_outpipes.Remove(pipe.Identity); Debug.Assert(old != null); @@ -290,7 +290,7 @@ protected override bool XSend(ref Msg msg) // mandatory is set. var identity = msg.UnsafeToArray(); - if (m_outpipes.TryGetValue(identity, out Outpipe op)) + if (m_outpipes.TryGetValue(identity, out Outpipe? op)) { m_currentOut = op.Pipe; if (!m_currentOut.CheckWrite()) @@ -556,7 +556,7 @@ private bool IdentifyPeer(Pipe pipe) msg.Close(); - if (m_outpipes.TryGetValue(identity, out Outpipe existPipe)) + if (m_outpipes.TryGetValue(identity, out Outpipe? existPipe)) { if (!m_handover) { diff --git a/src/NetMQ/Core/Patterns/Stream.cs b/src/NetMQ/Core/Patterns/Stream.cs index 6b356061..0c83ed11 100644 --- a/src/NetMQ/Core/Patterns/Stream.cs +++ b/src/NetMQ/Core/Patterns/Stream.cs @@ -143,7 +143,7 @@ protected override void XTerminated(Pipe pipe) { Assumes.NotNull(pipe.Identity); - m_outpipes.TryGetValue(pipe.Identity, out Outpipe old); + m_outpipes.TryGetValue(pipe.Identity, out Outpipe? old); m_outpipes.Remove(pipe.Identity); Debug.Assert(old != null); @@ -206,7 +206,7 @@ protected override bool XSend(ref Msg msg) // mandatory is set. var identity = msg.UnsafeToArray(); - if (m_outpipes.TryGetValue(identity, out Outpipe op)) + if (m_outpipes.TryGetValue(identity, out Outpipe? op)) { m_currentOut = op.Pipe; if (!m_currentOut.CheckWrite()) diff --git a/src/NetMQ/Core/SocketBase.cs b/src/NetMQ/Core/SocketBase.cs index d2298fbd..40eddfff 100644 --- a/src/NetMQ/Core/SocketBase.cs +++ b/src/NetMQ/Core/SocketBase.cs @@ -929,7 +929,7 @@ public void TermEndpoint(string addr) if (UnregisterEndpoint(addr, this)) return; - if (!m_inprocs.TryGetValue(addr, out Pipe pipe)) + if (!m_inprocs.TryGetValue(addr, out Pipe? pipe)) throw new EndpointNotFoundException("Endpoint was not found and cannot be disconnected"); pipe.SendDisconnectMessage(); @@ -938,7 +938,7 @@ public void TermEndpoint(string addr) } else { - if (!m_endpoints.TryGetValue(addr, out Endpoint endpoint)) + if (!m_endpoints.TryGetValue(addr, out Endpoint? endpoint)) throw new EndpointNotFoundException("Endpoint was not found and cannot be disconnected"); endpoint.Pipe?.Terminate(false); diff --git a/src/NetMQ/Core/Transports/ByteArraySegment.cs b/src/NetMQ/Core/Transports/ByteArraySegment.cs index 6ea54160..da990a5e 100644 --- a/src/NetMQ/Core/Transports/ByteArraySegment.cs +++ b/src/NetMQ/Core/Transports/ByteArraySegment.cs @@ -413,7 +413,7 @@ public static explicit operator byte[](ByteArraySegment buffer) /// and has the same Offset property value /// and it's buffer points to the SAME byte-array as the otherObject does. /// - public override bool Equals(object otherObject) + public override bool Equals(object? otherObject) { var byteArraySegment = otherObject as ByteArraySegment; if (byteArraySegment != null) diff --git a/src/NetMQ/Core/Transports/Pgm/PgmAddress.cs b/src/NetMQ/Core/Transports/Pgm/PgmAddress.cs index 74f0486c..f248a61a 100644 --- a/src/NetMQ/Core/Transports/Pgm/PgmAddress.cs +++ b/src/NetMQ/Core/Transports/Pgm/PgmAddress.cs @@ -65,7 +65,7 @@ public void Resolve(string name, bool ip4Only) if (addrStr == "*") addrStr = "0.0.0.0"; - if (!IPAddress.TryParse(addrStr, out IPAddress ipAddress)) + if (!IPAddress.TryParse(addrStr, out IPAddress? ipAddress)) throw new InvalidException($"In PgmAddress.Resolve({name},{ip4Only}), addrStr ({addrStr}) must be a valid IPAddress."); this.Address = new IPEndPoint(ipAddress, port); diff --git a/src/NetMQ/Core/Transports/Pgm/PgmSocket.cs b/src/NetMQ/Core/Transports/Pgm/PgmSocket.cs index e0a2713d..6c3fcf21 100644 --- a/src/NetMQ/Core/Transports/Pgm/PgmSocket.cs +++ b/src/NetMQ/Core/Transports/Pgm/PgmSocket.cs @@ -97,7 +97,7 @@ internal void Init() Debug.WriteLine(xMsg); // If running on Microsoft Windows, suggest to the developer that he may need to install MSMQ in order to get PGM socket support. -#if NETSTANDARD1_1_OR_GREATER +#if NETSTANDARD || NET bool isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); #else bool isWindows = true; diff --git a/src/NetMQ/Core/Transports/Tcp/TcpAddress.cs b/src/NetMQ/Core/Transports/Tcp/TcpAddress.cs index 49b11810..18e090ed 100644 --- a/src/NetMQ/Core/Transports/Tcp/TcpAddress.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpAddress.cs @@ -91,7 +91,7 @@ public void Resolve(string name, bool ip4Only) } } - IPAddress ipAddress; + IPAddress? ipAddress; // Interpret * as Any. if (addrStr == "*") diff --git a/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs b/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs index 63bda2ca..5b4c6c21 100755 --- a/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpConnector.cs @@ -259,7 +259,15 @@ public void OutCompleted(SocketError socketError, int bytesTransferred) bytes.PutInteger(endian, m_options.TcpKeepaliveIdle, 4); bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); +#if NET + if (!OperatingSystem.IsWindows()) + { + throw new InvalidOperationException("Not supported on you platform"); // There is a pull request for .net8.0 + + } +#endif m_s.IOControl(IOControlCode.KeepAliveValues, (byte[])bytes, null); + } } diff --git a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs index 0ace481f..6a8b02ac 100644 --- a/src/NetMQ/Core/Transports/Tcp/TcpListener.cs +++ b/src/NetMQ/Core/Transports/Tcp/TcpListener.cs @@ -22,7 +22,7 @@ You should have received a copy of the GNU Lesser General Public License using System; using System.Diagnostics; using System.Net.Sockets; -#if NETSTANDARD2_0 || NETSTANDARD2_1 +#if NETSTANDARD || NET using System.Runtime.InteropServices; #endif using AsyncIO; @@ -142,7 +142,7 @@ public virtual void SetAddress(string addr) } } -#if NETSTANDARD2_0 || NETSTANDARD2_1 +#if NETSTANDARD || NET // This command is failing on linux if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) m_handle.ExclusiveAddressUse = false; @@ -214,7 +214,13 @@ public void InCompleted(SocketError socketError, int bytesTransferred) bytes.PutInteger(endian, m_options.TcpKeepalive, 0); bytes.PutInteger(endian, m_options.TcpKeepaliveIdle, 4); bytes.PutInteger(endian, m_options.TcpKeepaliveIntvl, 8); +#if NET + if (!OperatingSystem.IsWindows()) + { + throw new InvalidOperationException("Not supported on you platform"); // There is a pull request for .net8.0 + } +#endif acceptedSocket.IOControl(IOControlCode.KeepAliveValues, (byte[])bytes, null); } } @@ -268,16 +274,16 @@ private void Close() if (m_handle == null) return; - Assumes.NotNull(m_endpoint); - try { m_handle.Dispose(); - m_socket.EventClosed(m_endpoint, m_handle); + if (m_endpoint is not null) + m_socket.EventClosed(m_endpoint, m_handle); } catch (SocketException ex) { - m_socket.EventCloseFailed(m_endpoint, ex.SocketErrorCode.ToErrorCode()); + if (m_endpoint is not null) + m_socket.EventCloseFailed(m_endpoint, ex.SocketErrorCode.ToErrorCode()); } m_handle = null; diff --git a/src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs b/src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs index 04203df3..f20353aa 100644 --- a/src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs +++ b/src/NetMQ/Core/Utils/ByteArrayEqualityComparer.cs @@ -18,8 +18,10 @@ internal sealed class ByteArrayEqualityComparer : IEqualityComparer /// one of the two byte-arrays to compare /// the other byte-array to compare against /// - public bool Equals(byte[] x, byte[] y) + public bool Equals(byte[]? x, byte[]? y) { + if (x == y) return true; + if (x is null || y is null) return false; if (x.Length != y.Length) { return false; diff --git a/src/NetMQ/Core/Utils/OpCode.cs b/src/NetMQ/Core/Utils/OpCode.cs index 060064c6..c861d2e3 100644 --- a/src/NetMQ/Core/Utils/OpCode.cs +++ b/src/NetMQ/Core/Utils/OpCode.cs @@ -17,16 +17,15 @@ public static bool Open() // While this is supported in modern CPUs, the technique used for allocating executable memory, copying OP Code // for the read of the time stamp and invoking the OP Code can be detected as Malware by some anti-virus vendors. // https://github.com/zeromq/netmq/issues/1071 - string val = Environment.GetEnvironmentVariable("NETQM_SUPPRESS_RDTSC"); + string? val = Environment.GetEnvironmentVariable("NETQM_SUPPRESS_RDTSC"); if (!string.IsNullOrEmpty(val)) return false; -#if NETSTANDARD1_1_OR_GREATER || NET471_OR_GREATER + if (RuntimeInformation.ProcessArchitecture != Architecture.X86 && RuntimeInformation.ProcessArchitecture != Architecture.X64) { return false; // RDTSC instruction not supported } -#endif var p = (int)Environment.OSVersion.Platform; @@ -39,24 +38,25 @@ public static bool Open() // Unix if (IsARMArchitecture()) return false; - Assembly assembly = Assembly.Load("Mono.Posix"); + Assembly assembly = Assembly.Load("Mono.Posix") ?? throw new InvalidOperationException("Mmap failed"); + Type syscall = assembly.GetType("Mono.Unix.Native.Syscall") ?? throw new InvalidOperationException("Mmap failed"); + MethodInfo mmap = syscall?.GetMethod("mmap") ?? throw new InvalidOperationException("Mmap failed"); - Type syscall = assembly.GetType("Mono.Unix.Native.Syscall"); - MethodInfo mmap = syscall.GetMethod("mmap"); + Type mmapProts = assembly?.GetType("Mono.Unix.Native.MmapProts") ?? throw new InvalidOperationException("Mmap failed"); - Type mmapProts = assembly.GetType("Mono.Unix.Native.MmapProts"); object mmapProtsParam = Enum.ToObject(mmapProts, - (int)mmapProts.GetField("PROT_READ").GetValue(null) | - (int)mmapProts.GetField("PROT_WRITE").GetValue(null) | - (int)mmapProts.GetField("PROT_EXEC").GetValue(null)); + (int)(mmapProts.GetField("PROT_READ")?.GetValue(null) ?? 0) | + (int)(mmapProts.GetField("PROT_WRITE")?.GetValue(null) ?? 0) | + (int)(mmapProts.GetField("PROT_EXEC")?.GetValue(null) ?? 0)); - Type mmapFlags = assembly.GetType("Mono.Unix.Native.MmapFlags"); + Type mmapFlags = assembly!.GetType("Mono.Unix.Native.MmapFlags") ?? + throw new InvalidOperationException("Mmap failed"); object mmapFlagsParam = Enum.ToObject(mmapFlags, - (int)mmapFlags.GetField("MAP_ANONYMOUS").GetValue(null) | - (int)mmapFlags.GetField("MAP_PRIVATE").GetValue(null)); + (int)(mmapFlags.GetField("MAP_ANONYMOUS")?.GetValue(null) ?? 0) | + (int)(mmapFlags.GetField("MAP_PRIVATE")?.GetValue(null) ?? 0)); s_codeBuffer = (IntPtr)mmap.Invoke(null, - new[] { IntPtr.Zero, s_size, mmapProtsParam, mmapFlagsParam, -1, 0 }); + new[] { IntPtr.Zero, s_size, mmapProtsParam, mmapFlagsParam, -1, 0 })!; if (s_codeBuffer == IntPtr.Zero || s_codeBuffer == (IntPtr)(-1)) { @@ -82,18 +82,19 @@ private static bool IsARMArchitecture() { // force to load from mono gac Assembly currentAssembly = Assembly.Load("Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756"); - Type syscall = currentAssembly.GetType("Mono.Unix.Native.Syscall"); - Type utsname = currentAssembly.GetType("Mono.Unix.Native.Utsname"); - MethodInfo uname = syscall.GetMethod("uname"); + Type? syscall = currentAssembly.GetType("Mono.Unix.Native.Syscall"); + Type? utsname = currentAssembly.GetType("Mono.Unix.Native.Utsname"); + if (syscall is null || utsname is null) return false; + MethodInfo? uname = syscall.GetMethod("uname"); object?[] parameters = { null }; - var invokeResult = (int)uname.Invoke(null, parameters); + var invokeResult = (int) (uname?.Invoke(null, parameters) ?? -1); if (invokeResult != 0) return false; var currentValues = parameters[0]; - var machineValue = (string)utsname.GetField("machine").GetValue(currentValues); + var machineValue = (string)(utsname!.GetField("machine")?.GetValue(currentValues) ?? "unknown"); return machineValue.ToLower().Contains("arm"); } @@ -109,9 +110,9 @@ public static void Close() Assembly.Load("Mono.Posix, Version=2.0.0.0, Culture=neutral, " + "PublicKeyToken=0738eb9f132ed756"); - Type syscall = assembly.GetType("Mono.Unix.Native.Syscall"); - MethodInfo munmap = syscall.GetMethod("munmap"); - munmap.Invoke(null, new object[] { s_codeBuffer, s_size }); + Type? syscall = assembly.GetType("Mono.Unix.Native.Syscall"); + MethodInfo? munmap = syscall?.GetMethod("munmap"); + munmap?.Invoke(null, new object[] { s_codeBuffer, s_size }); } else { diff --git a/src/NetMQ/Core/Utils/Poller.cs b/src/NetMQ/Core/Utils/Poller.cs index b61bce14..1a7385ce 100644 --- a/src/NetMQ/Core/Utils/Poller.cs +++ b/src/NetMQ/Core/Utils/Poller.cs @@ -167,7 +167,7 @@ public void AddHandle(Socket handle, IPollEvents events) /// the System.Net.Sockets.Socket to remove public void RemoveHandle(Socket handle) { - PollSet pollSet = m_addList.FirstOrDefault(p => p.Socket == handle); + PollSet? pollSet = m_addList.FirstOrDefault(p => p.Socket == handle); // If the socket was removed before being added there is no reason to mark retired, so just cancelling the socket and removing from add list. diff --git a/src/NetMQ/Core/Utils/Signaler.cs b/src/NetMQ/Core/Utils/Signaler.cs index 8183132f..302a8ec2 100644 --- a/src/NetMQ/Core/Utils/Signaler.cs +++ b/src/NetMQ/Core/Utils/Signaler.cs @@ -50,7 +50,7 @@ public Signaler() m_writeSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Unspecified) { NoDelay = true }; - m_writeSocket.Connect(listener.LocalEndPoint); + m_writeSocket.Connect(listener.LocalEndPoint!); m_readSocket = listener.Accept(); } diff --git a/src/NetMQ/Core/Utils/SpanUtility.cs b/src/NetMQ/Core/Utils/SpanUtility.cs index a5c529d3..2fc6d37b 100644 --- a/src/NetMQ/Core/Utils/SpanUtility.cs +++ b/src/NetMQ/Core/Utils/SpanUtility.cs @@ -7,7 +7,7 @@ internal static class SpanUtility { public static string ToAscii(Span bytes) { -#if NETSTANDARD2_1 +#if NETSTANDARD || NET return Encoding.ASCII.GetString(bytes); #else return Encoding.ASCII.GetString(bytes.ToArray()); diff --git a/src/NetMQ/GroupSocketExtensions.cs b/src/NetMQ/GroupSocketExtensions.cs index f4c30550..5a7cf025 100644 --- a/src/NetMQ/GroupSocketExtensions.cs +++ b/src/NetMQ/GroupSocketExtensions.cs @@ -376,7 +376,7 @@ public static bool TryReceiveBytes(this IGroupInSocket socket, TimeSpan timeout, #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. /// @@ -575,7 +575,7 @@ public static bool TryReceiveString(this IGroupInSocket socket, TimeSpan timeout #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. /// diff --git a/src/NetMQ/Monitoring/NetMQMonitor.cs b/src/NetMQ/Monitoring/NetMQMonitor.cs index a782ebd6..8c64ed00 100644 --- a/src/NetMQ/Monitoring/NetMQMonitor.cs +++ b/src/NetMQ/Monitoring/NetMQMonitor.cs @@ -152,7 +152,7 @@ public NetMQMonitor(NetMQSocket socket, string endpoint, bool ownsSocket = false #endregion - private void Handle(object sender, NetMQSocketEventArgs socketEventArgs) + private void Handle(object? sender, NetMQSocketEventArgs socketEventArgs) { var monitorEvent = MonitorEvent.Read(m_monitoringSocket.SocketHandle); diff --git a/src/NetMQ/Msg.cs b/src/NetMQ/Msg.cs index e75c3b5f..79e07ca0 100644 --- a/src/NetMQ/Msg.cs +++ b/src/NetMQ/Msg.cs @@ -330,7 +330,7 @@ public byte[] ToArray() var data = new byte[Size]; if (Size > 0) - Buffer.BlockCopy(m_data, m_offset, data, 0, Size); + Buffer.BlockCopy(m_data!, m_offset, data, 0, Size); return data; } @@ -548,6 +548,7 @@ public override string ToString() /// The string public string GetString(Encoding encoding) { + Assumes.NotNull(m_data); return encoding.GetString(m_data, m_offset, Size); } @@ -560,6 +561,7 @@ public string GetString(Encoding encoding) /// The string public string GetString(Encoding encoding, int offset, int count) { + Assumes.NotNull(m_data); return encoding.GetString(m_data, m_offset + offset, count); } @@ -573,7 +575,7 @@ public void Put(byte[]? src, int dstOffset, int len) { if (len == 0 || src == null) return; - + Assumes.NotNull(m_data); Buffer.BlockCopy(src, 0, m_data, dstOffset, len); } @@ -587,6 +589,7 @@ public void Put(byte[]? src, int dstOffset, int len) public void Put(byte[]? src, int srcOffset, int dstOffset, int len) { if (len == 0 || src == null) return; + Assumes.NotNull(m_data); Buffer.BlockCopy(src, srcOffset, m_data, dstOffset, len); } @@ -619,6 +622,7 @@ public void Put(byte b, int i) /// The index to write the string to public void Put(Encoding encoding, string str, int index) { + Assumes.NotNull(m_data); encoding.GetBytes(str, 0, str.Length, m_data, m_offset + index); } /// @@ -728,7 +732,7 @@ public byte[] CloneData() var data = new byte[Size]; if (Size > 0) - Buffer.BlockCopy(m_data, m_offset, data, 0, Size); + Buffer.BlockCopy(m_data!, m_offset, data, 0, Size); return data; } diff --git a/src/NetMQ/NetMQ.csproj b/src/NetMQ/NetMQ.csproj index 788c2879..e6f95fa7 100644 --- a/src/NetMQ/NetMQ.csproj +++ b/src/NetMQ/NetMQ.csproj @@ -3,7 +3,7 @@ A 100% native C# port of the lightweight high performance messaging library ZeroMQ 4.0.0.0 - net47;netstandard2.1 + net8.0;net472;netstandard2.1 portable ./NetMQ.snk true @@ -24,9 +24,9 @@ true - + true - + @@ -38,17 +38,13 @@ - - - - - - + + - + diff --git a/src/NetMQ/NetMQActor.cs b/src/NetMQ/NetMQActor.cs index 60e9159f..055a4330 100644 --- a/src/NetMQ/NetMQActor.cs +++ b/src/NetMQ/NetMQActor.cs @@ -151,8 +151,8 @@ private NetMQActor(PairSocket self, PairSocket shim, IShimHandler shimHandler) var args = new NetMQActorEventArgs(this); - void OnReceive(object sender, NetMQSocketEventArgs e) => m_receiveEvent!.Fire(this, args); - void OnSend (object sender, NetMQSocketEventArgs e) => m_sendEvent !.Fire(this, args); + void OnReceive(object? sender, NetMQSocketEventArgs e) => m_receiveEvent!.Fire(this, args); + void OnSend (object? sender, NetMQSocketEventArgs e) => m_sendEvent !.Fire(this, args); m_receiveEvent = new EventDelegator( () => m_self.ReceiveReady += OnReceive, diff --git a/src/NetMQ/NetMQBeacon.cs b/src/NetMQ/NetMQBeacon.cs index 6c224c05..145d3e43 100644 --- a/src/NetMQ/NetMQBeacon.cs +++ b/src/NetMQ/NetMQBeacon.cs @@ -125,7 +125,7 @@ private void Configure(string interfaceName, int port) // on linux to receive broadcast you must bind to the broadcast address specifically //bindTo = @interface.Address; sendTo = @interface.BroadcastAddress; -#if NET45 || NET47 +#if NETFRAMEWORK if (Environment.OSVersion.Platform==PlatformID.Unix) #else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) @@ -144,7 +144,7 @@ private void Configure(string interfaceName, int port) } } - if (bindTo != null) + if (bindTo != null && sendTo != null) { m_broadcastAddress = new IPEndPoint(sendTo, m_udpPort); m_udpSocket.Bind(new IPEndPoint(bindTo, m_udpPort)); @@ -189,7 +189,7 @@ public void Run(PairSocket shim) #endif } - private void PingElapsed(object sender, NetMQTimerEventArgs e) + private void PingElapsed(object? sender, NetMQTimerEventArgs e) { Assumes.NotNull(m_transmit); @@ -201,7 +201,7 @@ private void OnUdpReady(Socket socket) Assumes.NotNull(m_pipe); if (!TryReceiveUdpFrame(out NetMQFrame? frame, out string? peerName)) - return; + return; // If filter is set, check that beacon matches it var isValid = frame.MessageSize >= m_filter?.MessageSize && Compare(frame, m_filter, m_filter.MessageSize); @@ -222,7 +222,7 @@ private void OnUdpReady(Socket socket) } } - private void OnPipeReady(object sender, NetMQSocketEventArgs e) + private void OnPipeReady(object? sender, NetMQSocketEventArgs e) { Assumes.NotNull(m_pipe); Assumes.NotNull(m_pingTimer); @@ -266,6 +266,7 @@ private void OnPipeReady(object sender, NetMQSocketEventArgs e) private void SendUdpFrame(NetMQFrame frame) { Assumes.NotNull(m_udpSocket); + Assumes.NotNull(m_broadcastAddress); try { @@ -299,7 +300,7 @@ private bool TryReceiveUdpFrame([NotNullWhen(returnValue: true)] out NetMQFrame? return false; } - peerName = peer.ToString(); + peerName = peer.ToString()!; frame = new NetMQFrame(buffer, bytesRead); return true; } @@ -322,7 +323,7 @@ public NetMQBeacon() { m_actor = NetMQActor.Create(new Shim()); - void OnReceive(object sender, NetMQActorEventArgs e) => m_receiveEvent!.Fire(this, new NetMQBeaconEventArgs(this)); + void OnReceive(object? sender, NetMQActorEventArgs e) => m_receiveEvent!.Fire(this, new NetMQBeaconEventArgs(this)); m_receiveEvent = new EventDelegator( () => m_actor.ReceiveReady += OnReceive, diff --git a/src/NetMQ/NetMQException.cs b/src/NetMQ/NetMQException.cs index a42af6be..eff51685 100644 --- a/src/NetMQ/NetMQException.cs +++ b/src/NetMQ/NetMQException.cs @@ -46,17 +46,27 @@ public NetMQException(string message, Exception innerException) /// Constructor for serialisation. protected NetMQException(SerializationInfo info, StreamingContext context) +#pragma warning disable SYSLIB0051 // Legacy serialization support APIs are obsolete : base(info, context) +#pragma warning restore SYSLIB0051 // Legacy serialization support APIs are obsolete { ErrorCode = (ErrorCode)info.GetInt32("ErrorCode"); } /// + +#if !NET + [SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)] +#endif +#pragma warning disable CS0672 // Member overrides obsolete member public override void GetObjectData(SerializationInfo info, StreamingContext context) +#pragma warning restore CS0672 // Member overrides obsolete member { info.AddValue("ErrorCode", ErrorCode); +#pragma warning disable SYSLIB0051 // Legacy serialization support APIs are obsolete base.GetObjectData(info, context); +#pragma warning restore SYSLIB0051 // Legacy serialization support APIs are obsolete } #endregion diff --git a/src/NetMQ/NetMQFrame.cs b/src/NetMQ/NetMQFrame.cs index bf1ee3e4..33f1d419 100644 --- a/src/NetMQ/NetMQFrame.cs +++ b/src/NetMQ/NetMQFrame.cs @@ -258,7 +258,7 @@ public bool Equals(NetMQFrame? other) return true; } - bool IEquatable.Equals(NetMQFrame other) + bool IEquatable.Equals(NetMQFrame? other) { return Equals(other); } @@ -268,7 +268,7 @@ bool IEquatable.Equals(NetMQFrame other) /// /// the Object to compare this to /// true only if the given Object is a NetMQFrame equal to this one - public override bool Equals(object obj) + public override bool Equals(object? obj) { return Equals(obj as NetMQFrame); } diff --git a/src/NetMQ/NetMQPoller.cs b/src/NetMQ/NetMQPoller.cs index 476d0c2c..4addedb5 100644 --- a/src/NetMQ/NetMQPoller.cs +++ b/src/NetMQ/NetMQPoller.cs @@ -633,17 +633,15 @@ private void RunPoller() else if (item.ResultEvent.HasError() || item.ResultEvent.HasIn()) { Assumes.NotNull(item.FileDescriptor); - if (m_pollinSockets.TryGetValue(item.FileDescriptor, out Action action)) + if (m_pollinSockets.TryGetValue(item.FileDescriptor, out Action? action)) action(item.FileDescriptor); } } } -#if !NET35 // Try to dequeue and execute all pending tasks before stopping poller while (m_tasksQueue.TryDequeue(out Task? task, TimeSpan.Zero)) TryExecuteTask(task); -#endif } finally { @@ -687,7 +685,7 @@ public void StopAsync() #endregion - private void OnSocketEventsChanged(object sender, NetMQSocketEventArgs e) + private void OnSocketEventsChanged(object? sender, NetMQSocketEventArgs e) { // when the sockets SendReady or ReceiveReady changed we marked the poller as dirty in order to reset the poll events m_isPollSetDirty = true; diff --git a/src/NetMQ/NetMQProactor.cs b/src/NetMQ/NetMQProactor.cs index 017592fe..67aa5e6a 100644 --- a/src/NetMQ/NetMQProactor.cs +++ b/src/NetMQ/NetMQProactor.cs @@ -48,7 +48,7 @@ private void Run(PairSocket shim) m_receiveSocket.ReceiveReady -= OnSocketReady; } - private void OnShimReady(object sender, NetMQSocketEventArgs e) + private void OnShimReady(object? sender, NetMQSocketEventArgs e) { Assumes.NotNull(m_poller); @@ -59,7 +59,7 @@ private void OnShimReady(object sender, NetMQSocketEventArgs e) } } - private void OnSocketReady(object sender, NetMQSocketEventArgs e) + private void OnSocketReady(object? sender, NetMQSocketEventArgs e) { NetMQMessage message = m_receiveSocket.ReceiveMultipartMessage(); diff --git a/src/NetMQ/NetMQQueue.cs b/src/NetMQ/NetMQQueue.cs index d6c20777..0bd5f648 100644 --- a/src/NetMQ/NetMQQueue.cs +++ b/src/NetMQ/NetMQQueue.cs @@ -57,7 +57,7 @@ public NetMQQueue(int capacity = 0) m_dequeueMsg.InitEmpty(); } - private void OnReceiveReady(object sender, NetMQSocketEventArgs e) + private void OnReceiveReady(object? sender, NetMQSocketEventArgs e) { m_eventDelegator.Fire(this, new NetMQQueueEventArgs(this)); } @@ -94,7 +94,7 @@ public event EventHandler> ReceiveReady /// Will be filled with the item upon success /// Timeout to try and dequeue and item /// Will return false if it didn't succeed to dequeue an item after the timeout. - public bool TryDequeue([MaybeNull] out T result, TimeSpan timeout) + public bool TryDequeue([MaybeNullWhen(false)] out T result, TimeSpan timeout) { if (m_reader.TryReceive(ref m_dequeueMsg, timeout)) { @@ -111,11 +111,11 @@ public bool TryDequeue([MaybeNull] out T result, TimeSpan timeout) /// Dequeue an item from the queue, will block if queue is empty. Dequeueing and item is not thread safe. /// /// Dequeued item - public T Dequeue() + public T? Dequeue() { m_reader.TryReceive(ref m_dequeueMsg, SendReceiveConstants.InfiniteTimeout); - m_queue.TryDequeue(out T result); + m_queue.TryDequeue(out T? result); return result; } diff --git a/src/NetMQ/NetMQRuntime.cs b/src/NetMQ/NetMQRuntime.cs index 87748a31..f709a3db 100644 --- a/src/NetMQ/NetMQRuntime.cs +++ b/src/NetMQ/NetMQRuntime.cs @@ -1,5 +1,3 @@ -#if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 - using System; using System.Threading; using System.Threading.Tasks; @@ -16,7 +14,7 @@ public class NetMQRuntime : IDisposable { private NetMQPoller m_poller; private readonly NetMQSynchronizationContext m_synchronizationContext; - private readonly SynchronizationContext m_oldSynchronizationContext; + private readonly SynchronizationContext? m_oldSynchronizationContext; private static readonly ThreadLocal s_current = new ThreadLocal(); private readonly List m_sockets; @@ -38,7 +36,7 @@ public NetMQRuntime() /// public static NetMQRuntime Current { - get { return s_current.Value; } + get => s_current.Value ?? throw new InvalidOperationException("NetMQRuntime.Current is not available on this thread. Ensure that a NetMQRuntime has been created."); } internal static NetMQPoller Poller @@ -54,7 +52,7 @@ public void Run(params Task[] tasks) { Run(CancellationToken.None, tasks); } - + internal void Add(NetMQSocket socket) { m_poller.Add(socket); @@ -99,4 +97,3 @@ public void Dispose() } } -#endif \ No newline at end of file diff --git a/src/NetMQ/NetMQSocket.cs b/src/NetMQ/NetMQSocket.cs index 05a52ccb..06f5aeab 100644 --- a/src/NetMQ/NetMQSocket.cs +++ b/src/NetMQ/NetMQSocket.cs @@ -3,9 +3,7 @@ using System.Linq; using System.Threading; using NetMQ.Core; -#if NET40 -using NetMQ.Core.Utils; -#endif + namespace NetMQ { @@ -25,9 +23,7 @@ public abstract class NetMQSocket : INetMQSocket private EventHandler? m_sendReady; private int m_isClosed; - #if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 private NetMQRuntime? m_runtime; - #endif internal enum DefaultAction { @@ -249,13 +245,11 @@ public void Unbind(string address) /// Closes this socket, rendering it unusable. Equivalent to calling . public void Close() { - #if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 if (m_runtime != null) { m_runtime.Remove(this); m_runtime = null; } - #endif if (Interlocked.CompareExchange(ref m_isClosed, 1, 0) != 0) return; @@ -391,8 +385,6 @@ public virtual bool TrySend(ref Msg msg, TimeSpan timeout, bool more) #endregion - #if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 - internal void AttachToRuntime() { if (m_runtime == null) @@ -409,8 +401,6 @@ internal void DetachFromRuntime() m_runtime = null; } - #endif - /// /// Listen to the given endpoint for SocketEvent events. /// diff --git a/src/NetMQ/NetMQSynchronizationContext.cs b/src/NetMQ/NetMQSynchronizationContext.cs index 54f863a8..87137392 100644 --- a/src/NetMQ/NetMQSynchronizationContext.cs +++ b/src/NetMQ/NetMQSynchronizationContext.cs @@ -1,7 +1,7 @@ using System.Threading; using System.Threading.Tasks; -#if !NET35 + namespace NetMQ { internal sealed class NetMQSynchronizationContext : SynchronizationContext @@ -14,14 +14,14 @@ public NetMQSynchronizationContext(NetMQPoller poller) } /// Dispatches an asynchronous message to a synchronization context. - public override void Post(SendOrPostCallback d, object state) + public override void Post(SendOrPostCallback d, object? state) { var task = new Task(() => d(state)); task.Start(m_poller); } /// Dispatches a synchronous message to a synchronization context. - public override void Send(SendOrPostCallback d, object state) + public override void Send(SendOrPostCallback d, object? state) { var task = new Task(() => d(state)); task.Start(m_poller); @@ -29,4 +29,3 @@ public override void Send(SendOrPostCallback d, object state) } } } -#endif \ No newline at end of file diff --git a/src/NetMQ/Proxy.cs b/src/NetMQ/Proxy.cs index fa9da7f9..984e10bc 100644 --- a/src/NetMQ/Proxy.cs +++ b/src/NetMQ/Proxy.cs @@ -114,8 +114,8 @@ public void Stop() m_state = StateStopped; } - private void OnFrontendReady(object sender, NetMQSocketEventArgs e) => ProxyBetween(m_frontend, m_backend, m_controlIn); - private void OnBackendReady (object sender, NetMQSocketEventArgs e) => ProxyBetween(m_backend, m_frontend, m_controlOut); + private void OnFrontendReady(object? sender, NetMQSocketEventArgs e) => ProxyBetween(m_frontend, m_backend, m_controlIn); + private void OnBackendReady (object? sender, NetMQSocketEventArgs e) => ProxyBetween(m_backend, m_frontend, m_controlOut); private static void ProxyBetween(IReceivingSocket from, IOutgoingSocket to, IOutgoingSocket? control) { diff --git a/src/NetMQ/ReceiveThreadSafeSocketExtensions.cs b/src/NetMQ/ReceiveThreadSafeSocketExtensions.cs index d0a163e8..f4afa632 100644 --- a/src/NetMQ/ReceiveThreadSafeSocketExtensions.cs +++ b/src/NetMQ/ReceiveThreadSafeSocketExtensions.cs @@ -119,7 +119,7 @@ public static ValueTask ReceiveBytesAsync(this IThreadSafeInSocket socke #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. @@ -302,7 +302,7 @@ public static ValueTask ReceiveStringAsync(this IThreadSafeInSocket sock #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. diff --git a/src/NetMQ/RoutingIdSocketExtensions.cs b/src/NetMQ/RoutingIdSocketExtensions.cs index 6aaac857..53833646 100644 --- a/src/NetMQ/RoutingIdSocketExtensions.cs +++ b/src/NetMQ/RoutingIdSocketExtensions.cs @@ -372,7 +372,7 @@ public static bool TryReceiveBytes(this IRoutingIdSocket socket, TimeSpan timeou #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. @@ -564,7 +564,7 @@ public static bool TryReceiveString(this IRoutingIdSocket socket, TimeSpan timeo #region AsyncEnumerable -#if NETSTANDARD2_1 +#if NETSTANDARD || NET /// /// Provides a consuming IAsyncEnumerable for receiving messages from the socket. diff --git a/src/NetMQ/RoutingKey.cs b/src/NetMQ/RoutingKey.cs index 68c3c146..28c432a1 100644 --- a/src/NetMQ/RoutingKey.cs +++ b/src/NetMQ/RoutingKey.cs @@ -50,7 +50,7 @@ internal byte[] Bytes /// /// Object to compare against, valid types are byte-array and RoutingKey /// True if equals, otherwise false - public override bool Equals(object obj) + public override bool Equals(object? obj) { if (obj is RoutingKey) return Equals((RoutingKey) obj); @@ -66,9 +66,9 @@ public override bool Equals(object obj) /// /// Byte-array to compare against /// True if equals, otherwise false - public bool Equals(byte[] x) + public bool Equals(byte[]? x) { - if (bytes.Length != x.Length) + if (bytes.Length != x?.Length) { return false; } diff --git a/src/NetMQ/ThreadSafeSocket.cs b/src/NetMQ/ThreadSafeSocket.cs index b0d5b7f1..d9bf7a43 100644 --- a/src/NetMQ/ThreadSafeSocket.cs +++ b/src/NetMQ/ThreadSafeSocket.cs @@ -200,13 +200,13 @@ public void Unbind(string address) /// Closes this socket, rendering it unusable. Equivalent to calling . public void Close() { - // #if NETSTANDARD2_0 || NETSTANDARD2_1 || NET47 + // if (m_runtime != null) // { // m_runtime.Remove(this); // m_runtime = null; // } - // #endif + if (Interlocked.Exchange(ref m_isClosed, 1) != 0) return; diff --git a/src/NetMQ/Utils/EncodingExtensions.cs b/src/NetMQ/Utils/EncodingExtensions.cs index 059ed556..d46740f7 100644 --- a/src/NetMQ/Utils/EncodingExtensions.cs +++ b/src/NetMQ/Utils/EncodingExtensions.cs @@ -1,4 +1,4 @@ -#if !NETSTANDARD2_1 +#if NETFRAMEWORK using System; using System.Text; diff --git a/src/Performance/NetMQ.SimpleTests/NetMQ.SimpleTests.csproj b/src/Performance/NetMQ.SimpleTests/NetMQ.SimpleTests.csproj index d3810f06..b9fa3ad2 100644 --- a/src/Performance/NetMQ.SimpleTests/NetMQ.SimpleTests.csproj +++ b/src/Performance/NetMQ.SimpleTests/NetMQ.SimpleTests.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe diff --git a/src/Performance/local_lat/local_lat.csproj b/src/Performance/local_lat/local_lat.csproj index d3810f06..b9fa3ad2 100644 --- a/src/Performance/local_lat/local_lat.csproj +++ b/src/Performance/local_lat/local_lat.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe diff --git a/src/Performance/local_thr/local_thr.csproj b/src/Performance/local_thr/local_thr.csproj index d3810f06..b9fa3ad2 100644 --- a/src/Performance/local_thr/local_thr.csproj +++ b/src/Performance/local_thr/local_thr.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe diff --git a/src/Performance/remote_lat/remote_lat.csproj b/src/Performance/remote_lat/remote_lat.csproj index 9c8142a4..6f987b46 100644 --- a/src/Performance/remote_lat/remote_lat.csproj +++ b/src/Performance/remote_lat/remote_lat.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe diff --git a/src/Performance/remote_thr/remote_thr.csproj b/src/Performance/remote_thr/remote_thr.csproj index d3810f06..b9fa3ad2 100644 --- a/src/Performance/remote_thr/remote_thr.csproj +++ b/src/Performance/remote_thr/remote_thr.csproj @@ -1,7 +1,7 @@  - net6.0 + net9.0 Exe