diff --git a/README.md b/README.md
index dacc228..a6e990a 100644
--- a/README.md
+++ b/README.md
@@ -18,12 +18,13 @@ S7.Net Plus has a [User Manual](https://github.com/killnine/s7netplus/blob/maste
+ Compatible S7 PLC (S7-200, S7-300, S7-400, S7-1200, S7-1500)
-## Target framework
-+ .NET Framework 3.5 or higher
-+ Universal Windows Application (.Net Core) - see S7.UniversalWindowsApp.sln
+## Supported frameworks
++ .NET Framework 4.5.2 and higher
++ .NET Standard 1.3 (.NET Core 1.0, UWP 10.0, Xamarin, ...)
++ .NET Standard 2.0 (.NET Core 2.0, .NET Framework 4.6.1)
## Compile
-You need at least Visual Studio 2015 (you can download the Community Edition for free).
+You need at least Visual Studio 2017 (you can download the Community Edition for free).
## Nuget
diff --git a/S7.Net.Core/Properties/AssemblyInfo.cs b/S7.Net.Core/Properties/AssemblyInfo.cs
deleted file mode 100644
index bc10b55..0000000
--- a/S7.Net.Core/Properties/AssemblyInfo.cs
+++ /dev/null
@@ -1,29 +0,0 @@
-using System.Reflection;
-using System.Runtime.CompilerServices;
-using System.Runtime.InteropServices;
-
-// General Information about an assembly is controlled through the following
-// set of attributes. Change these attribute values to modify the information
-// associated with an assembly.
-[assembly: AssemblyTitle("S7.Net.Core")]
-[assembly: AssemblyDescription("")]
-[assembly: AssemblyConfiguration("")]
-[assembly: AssemblyCompany("Microsoft")]
-[assembly: AssemblyProduct("S7.Net.Core")]
-[assembly: AssemblyCopyright("Copyright © Microsoft 2016")]
-[assembly: AssemblyTrademark("")]
-[assembly: AssemblyCulture("")]
-
-// Version information for an assembly consists of the following four values:
-//
-// Major Version
-// Minor Version
-// Build Number
-// Revision
-//
-// You can specify all the values or you can default the Build and Revision Numbers
-// by using the '*' as shown below:
-// [assembly: AssemblyVersion("1.0.*")]
-[assembly: AssemblyVersion("1.0.0.0")]
-[assembly: AssemblyFileVersion("1.0.0.0")]
-[assembly: ComVisible(false)]
\ No newline at end of file
diff --git a/S7.Net.Core/Properties/S7.Net.Core.rd.xml b/S7.Net.Core/Properties/S7.Net.Core.rd.xml
deleted file mode 100644
index 6cda541..0000000
--- a/S7.Net.Core/Properties/S7.Net.Core.rd.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-
-
-
-
-
-
-
-
-
diff --git a/S7.Net.Core/S7.Net.Core.csproj b/S7.Net.Core/S7.Net.Core.csproj
deleted file mode 100644
index 2d16f96..0000000
--- a/S7.Net.Core/S7.Net.Core.csproj
+++ /dev/null
@@ -1,176 +0,0 @@
-
-
-
-
- Debug
- AnyCPU
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}
- Library
- Properties
- S7.Net.Core
- S7.Net.Core
- en-US
- UAP
- 10.0.10586.0
- 10.0.10240.0
- 14
- 512
- {A5A43C5B-DE2A-4C0C-9213-0A381AF9435A};{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}
-
-
- ARM
- true
- full
- false
- bin\Debug\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
- prompt
- 4
-
-
- ARM
- pdbonly
- true
- bin\Release\
- TRACE;NETFX_CORE;WINDOWS_UWP
- prompt
- 4
-
-
- x86
- true
- bin\x86\Debug\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
- ;2008
- full
- x86
- false
- prompt
-
-
- x86
- bin\x86\Release\
- TRACE;NETFX_CORE;WINDOWS_UWP
- true
- ;2008
- pdbonly
- x86
- false
- prompt
-
-
- ARM
- true
- bin\ARM\Debug\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
- ;2008
- full
- ARM
- false
- prompt
-
-
- ARM
- bin\ARM\Release\
- TRACE;NETFX_CORE;WINDOWS_UWP
- true
- ;2008
- pdbonly
- ARM
- false
- prompt
-
-
- x64
- true
- bin\x64\Debug\
- DEBUG;TRACE;NETFX_CORE;WINDOWS_UWP
- ;2008
- full
- x64
- false
- prompt
-
-
- x64
- bin\x64\Release\
- TRACE;NETFX_CORE;WINDOWS_UWP
- true
- ;2008
- pdbonly
- x64
- false
- prompt
-
-
-
-
-
-
-
- Conversion.cs
-
-
- Enums.cs
-
-
- PLC.cs
-
-
- Types\Boolean.cs
-
-
- Types\Byte.cs
-
-
- Types\ByteArray.cs
-
-
- Types\Class.cs
-
-
- Types\Counter.cs
-
-
- Types\DataItem.cs
-
-
- Types\DInt.cs
-
-
- Types\Double.cs
-
-
- Types\DWord.cs
-
-
- Types\Int.cs
-
-
- Types\String.cs
-
-
- Types\Struct.cs
-
-
- Types\Timer.cs
-
-
- Types\Word.cs
-
-
-
-
-
-
- 14.0
-
-
-
-
\ No newline at end of file
diff --git a/S7.Net.Core/S7.Net.Core.nuget.props b/S7.Net.Core/S7.Net.Core.nuget.props
deleted file mode 100644
index a6d1cba..0000000
--- a/S7.Net.Core/S7.Net.Core.nuget.props
+++ /dev/null
@@ -1,21 +0,0 @@
-
-
-
- True
- NuGet
- C:\Users\shade\Documents\GitHub\s7netplus\S7.Net.Core\project.lock.json
- $(UserProfile)\.nuget\packages\
- C:\Users\shade\.nuget\packages\
- ProjectJson
- 4.3.1
-
-
- $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/S7.Net.Core/S7.Net.Core.nuget.targets b/S7.Net.Core/S7.Net.Core.nuget.targets
deleted file mode 100644
index e169bc8..0000000
--- a/S7.Net.Core/S7.Net.Core.nuget.targets
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
- $(MSBuildAllProjects);$(MSBuildThisFileFullPath)
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/S7.Net.Core/SocketClient.cs b/S7.Net.Core/SocketClient.cs
deleted file mode 100644
index a207f85..0000000
--- a/S7.Net.Core/SocketClient.cs
+++ /dev/null
@@ -1,481 +0,0 @@
-using System;
-using System.Net.Sockets;
-using System.Threading;
-using System.Net;
-
-namespace S7.Net
-{
- ///
- /// This class encapsulate System.Net.Sockets.Socket class of .Net core, so we can use the same methods of the standard Socket class inside the S7.Net sources.
- ///
- internal class Socket
- {
-
- public bool Connected
- {
- get
- {
- if (_socket == null)
- return false;
-
- return _socket.Connected;
- }
- }
-
- public SocketError LastSocketError { get; private set; }
-
- public Socket(AddressFamily addressFamily, SocketType socketType, ProtocolType protocolType)
- {
- _socket = new System.Net.Sockets.Socket(addressFamily, socketType, protocolType);
- }
-
- public void Connect(IPEndPoint server)
- {
- if (Connected)
- return;
-
- LastSocketError = SocketError.NotConnected;
-
- var socketEventArg = new SocketAsyncEventArgs();
-
- socketEventArg.RemoteEndPoint = server;
-
- var completedEvent = new EventHandler(delegate (object s, SocketAsyncEventArgs e)
- {
- LastSocketError = e.SocketError;
- _clientDone.Set();
- });
-
- socketEventArg.Completed += completedEvent;
-
- _clientDone.Reset();
-
- LastSocketError = SocketError.TimedOut;
-
- _socket.ConnectAsync(socketEventArg);
-
- _clientDone.WaitOne(TIMEOUT_MILLISECONDS);
-
- socketEventArg.Completed -= completedEvent;
- }
-
- public int Send(byte[] buffer, int size, SocketFlags socketFlag)
- {
- var response = 0;
-
- if (_socket != null)
- {
- var socketEventArg = new SocketAsyncEventArgs();
-
- socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
- socketEventArg.UserToken = null;
-
- var completedEvent = new EventHandler(delegate (object s, SocketAsyncEventArgs e)
- {
- LastSocketError = e.SocketError;
-
- if (e.SocketError == SocketError.Success)
- response = e.BytesTransferred;
-
- _clientDone.Set();
- });
-
- socketEventArg.Completed += completedEvent;
-
- socketEventArg.SetBuffer(buffer, 0, size);
-
- _clientDone.Reset();
-
- LastSocketError = SocketError.TimedOut;
-
- _socket.SendAsync(socketEventArg);
-
- _clientDone.WaitOne(_sendTimeout);
-
- socketEventArg.Completed -= completedEvent;
- }
- else
- {
- LastSocketError = SocketError.NotInitialized;
- }
-
- return response;
- }
-
- public int Receive(byte[] buffer, int size, SocketFlags socketFlag)
- {
- var response = 0;
-
- if (_socket != null)
- {
- var socketEventArg = new SocketAsyncEventArgs();
-
- socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
- socketEventArg.SetBuffer(buffer, 0, size);
-
- var completedEvent = new EventHandler(delegate (object s, SocketAsyncEventArgs e)
- {
- LastSocketError = e.SocketError;
-
- if (e.SocketError == SocketError.Success)
- response = e.BytesTransferred;
-
- _clientDone.Set();
- });
-
- socketEventArg.Completed += completedEvent;
-
- _clientDone.Reset();
-
- LastSocketError = SocketError.TimedOut;
-
- _socket.ReceiveAsync(socketEventArg);
-
- _clientDone.WaitOne(_receiveTimeout);
-
- socketEventArg.Completed -= completedEvent;
- }
- else
- {
- LastSocketError = SocketError.NotInitialized;
- }
-
- return response;
- }
-
- public void Shutdown(SocketShutdown how)
- {
- _socket.Shutdown(how);
- }
-
- public void Close()
- {
- if (_socket != null)
- {
- _socket.Dispose();
- _socket = null;
- }
- }
-
- //
- // Summary:
- // Sets the specified System.Net.Sockets.Socket option to the specified integer
- // value.
- //
- // Parameters:
- // optionLevel:
- // One of the System.Net.Sockets.SocketOptionLevel values.
- //
- // optionName:
- // One of the System.Net.Sockets.SocketOptionName values.
- //
- // optionValue:
- // A value of the option.
- //
- // Exceptions:
- // T:System.Net.Sockets.SocketException:
- // An error occurred when attempting to access the socket. See the Remarks section
- // for more information.
- //
- // T:System.ObjectDisposedException:
- // The System.Net.Sockets.Socket has been closed.
- public void SetSocketOption(SocketOptionLevel optionLevel, SocketOptionName optionName, int optionValue)
- {
- switch (optionName)
- {
- case SocketOptionName.ReceiveTimeout:
- _receiveTimeout = optionValue;
- break;
-
- case SocketOptionName.SendTimeout:
- _sendTimeout = optionValue;
- break;
-
- default:
- throw new NotImplementedException("SetSocketOption option not implemented");
- }
- }
-
- private System.Net.Sockets.Socket _socket = null;
- private int _receiveTimeout = TIMEOUT_MILLISECONDS;
- private int _sendTimeout = TIMEOUT_MILLISECONDS;
-
- private readonly static ManualResetEvent _clientDone =
- new ManualResetEvent(false);
-
- private const int TIMEOUT_MILLISECONDS = 1000;
-
- }
-
- //
- // Summary:
- // Specifies socket send and receive behaviors.
- [Flags]
- public enum SocketFlags
- {
- //
- // Summary:
- // Use no flags for this call.
- None = 0,
- ////
- //// Summary:
- //// Process out-of-band data.
- //OutOfBand = 1,
- ////
- //// Summary:
- //// Peek at the incoming message.
- //Peek = 2,
- ////
- //// Summary:
- //// Send without using routing tables.
- //DontRoute = 4,
- ////
- //// Summary:
- //// Provides a standard value for the number of WSABUF structures that are used to
- //// send and receive data.
- //MaxIOVectorLength = 16,
- ////
- //// Summary:
- //// The message was too large to fit into the specified buffer and was truncated.
- //Truncated = 256,
- ////
- //// Summary:
- //// Indicates that the control data did not fit into an internal 64-KB buffer and
- //// was truncated.
- //ControlDataTruncated = 512,
- ////
- //// Summary:
- //// Indicates a broadcast packet.
- //Broadcast = 1024,
- ////
- //// Summary:
- //// Indicates a multicast packet.
- //Multicast = 2048,
- ////
- //// Summary:
- //// Partial send or receive for message.
- //Partial = 32768
- }
-
- //
- // Summary:
- // Defines socket option levels for the System.Net.Sockets.Socket.SetSocketOption(System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName,System.Int32)
- // and System.Net.Sockets.Socket.GetSocketOption(System.Net.Sockets.SocketOptionLevel,System.Net.Sockets.SocketOptionName)
- // methods.
- public enum SocketOptionLevel
- {
- //
- // Summary:
- // System.Net.Sockets.Socket options apply only to IP sockets.
- IP = 0,
- //
- // Summary:
- // System.Net.Sockets.Socket options apply only to TCP sockets.
- Tcp = 6,
- //
- // Summary:
- // System.Net.Sockets.Socket options apply only to UDP sockets.
- Udp = 17,
- //
- // Summary:
- // System.Net.Sockets.Socket options apply only to IPv6 sockets.
- IPv6 = 41,
- //
- // Summary:
- // System.Net.Sockets.Socket options apply to all sockets.
- Socket = 65535
- }
-
- //
- // Summary:
- // Defines configuration option names.
- public enum SocketOptionName
- {
- //
- // Summary:
- // Close the socket gracefully without lingering.
- DontLinger = -129,
- //
- // Summary:
- // Enables a socket to be bound for exclusive access.
- ExclusiveAddressUse = -5,
- //
- // Summary:
- // Record debugging information.
- Debug = 1,
- //
- // Summary:
- // Specifies the IP options to be inserted into outgoing datagrams.
- IPOptions = 1,
- //
- // Summary:
- // Disables the Nagle algorithm for send coalescing.
- NoDelay = 1,
- //
- // Summary:
- // Send UDP datagrams with checksum set to zero.
- NoChecksum = 1,
- //
- // Summary:
- // The socket is listening.
- AcceptConnection = 2,
- //
- // Summary:
- // Indicates that the application provides the IP header for outgoing datagrams.
- HeaderIncluded = 2,
- //
- // Summary:
- // Use urgent data as defined in RFC-1222. This option can be set only once; after
- // it is set, it cannot be turned off.
- BsdUrgent = 2,
- //
- // Summary:
- // Use expedited data as defined in RFC-1222. This option can be set only once;
- // after it is set, it cannot be turned off.
- Expedited = 2,
- //
- // Summary:
- // Change the IP header type of the service field.
- TypeOfService = 3,
- //
- // Summary:
- // Allows the socket to be bound to an address that is already in use.
- ReuseAddress = 4,
- //
- // Summary:
- // Set the IP header Time-to-Live field.
- IpTimeToLive = 4,
- //
- // Summary:
- // Use keep-alives.
- KeepAlive = 8,
- //
- // Summary:
- // Set the interface for outgoing multicast packets.
- MulticastInterface = 9,
- //
- // Summary:
- // An IP multicast Time to Live.
- MulticastTimeToLive = 10,
- //
- // Summary:
- // An IP multicast loopback.
- MulticastLoopback = 11,
- //
- // Summary:
- // Add an IP group membership.
- AddMembership = 12,
- //
- // Summary:
- // Drop an IP group membership.
- DropMembership = 13,
- //
- // Summary:
- // Do not fragment IP datagrams.
- DontFragment = 14,
- //
- // Summary:
- // Join a source group.
- AddSourceMembership = 15,
- //
- // Summary:
- // Do not route; send the packet directly to the interface addresses.
- DontRoute = 16,
- //
- // Summary:
- // Drop a source group.
- DropSourceMembership = 16,
- //
- // Summary:
- // Block data from a source.
- BlockSource = 17,
- //
- // Summary:
- // Unblock a previously blocked source.
- UnblockSource = 18,
- //
- // Summary:
- // Return information about received packets.
- PacketInformation = 19,
- //
- // Summary:
- // Set or get the UDP checksum coverage.
- ChecksumCoverage = 20,
- //
- // Summary:
- // Specifies the maximum number of router hops for an Internet Protocol version
- // 6 (IPv6) packet. This is similar to Time to Live (TTL) for Internet Protocol
- // version 4.
- HopLimit = 21,
- //
- // Summary:
- // Permit sending broadcast messages on the socket.
- Broadcast = 32,
- //
- // Summary:
- // Bypass hardware when possible.
- UseLoopback = 64,
- //
- // Summary:
- // Linger on close if unsent data is present.
- Linger = 128,
- //
- // Summary:
- // Receives out-of-band data in the normal data stream.
- OutOfBandInline = 256,
- //
- // Summary:
- // Specifies the total per-socket buffer space reserved for sends. This is unrelated
- // to the maximum message size or the size of a TCP window.
- SendBuffer = 4097,
- //
- // Summary:
- // Specifies the total per-socket buffer space reserved for receives. This is unrelated
- // to the maximum message size or the size of a TCP window.
- ReceiveBuffer = 4098,
- //
- // Summary:
- // Specifies the low water mark for Overload:System.Net.Sockets.Socket.Send operations.
- SendLowWater = 4099,
- //
- // Summary:
- // Specifies the low water mark for Overload:System.Net.Sockets.Socket.Receive operations.
- ReceiveLowWater = 4100,
- //
- // Summary:
- // Send a time-out. This option applies only to synchronous methods; it has no effect
- // on asynchronous methods such as the System.Net.Sockets.Socket.BeginSend(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.AsyncCallback,System.Object)
- // method.
- SendTimeout = 4101,
- //
- // Summary:
- // Receive a time-out. This option applies only to synchronous methods; it has no
- // effect on asynchronous methods such as the System.Net.Sockets.Socket.BeginSend(System.Byte[],System.Int32,System.Int32,System.Net.Sockets.SocketFlags,System.AsyncCallback,System.Object)
- // method.
- ReceiveTimeout = 4102,
- //
- // Summary:
- // Get the error status and clear.
- Error = 4103,
- //
- // Summary:
- // Get the socket type.
- Type = 4104,
- //
- // Summary:
- // Updates an accepted socket's properties by using those of an existing socket.
- // This is equivalent to using the Winsock2 SO_UPDATE_ACCEPT_CONTEXT socket option
- // and is supported only on connection-oriented sockets.
- UpdateAcceptContext = 28683,
- //
- // Summary:
- // Updates a connected socket's properties by using those of an existing socket.
- // This is equivalent to using the Winsock2 SO_UPDATE_CONNECT_CONTEXT socket option
- // and is supported only on connection-oriented sockets.
- UpdateConnectContext = 28688,
- //
- // Summary:
- // Not supported; will throw a System.Net.Sockets.SocketException if used.
- MaxConnections = int.MaxValue
- }
-}
\ No newline at end of file
diff --git a/S7.Net.Core/project.json b/S7.Net.Core/project.json
deleted file mode 100644
index d269c23..0000000
--- a/S7.Net.Core/project.json
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "dependencies": {
- "Microsoft.NETCore.UniversalWindowsPlatform": "5.4.0"
- },
- "frameworks": {
- "uap10.0.10240": {}
- },
- "runtimes": {
- "win10-arm": {},
- "win10-arm-aot": {},
- "win10-x86": {},
- "win10-x86-aot": {},
- "win10-x64": {},
- "win10-x64-aot": {}
- }
-}
\ No newline at end of file
diff --git a/S7.Net/COTP.cs b/S7.Net/COTP.cs
index 0781709..364363f 100644
--- a/S7.Net/COTP.cs
+++ b/S7.Net/COTP.cs
@@ -1,6 +1,5 @@
using System;
using System.IO;
-using System.Net.Sockets;
using System.Threading.Tasks;
using System.Linq;
@@ -98,15 +97,20 @@ namespace S7.Net
var segment = TPDU.Read(stream);
if (segment == null) return null;
- var output = new MemoryStream(segment.Data.Length);
+ var buffer = new byte[segment.Data.Length];
+ var output = new MemoryStream(buffer);
output.Write(segment.Data, 0, segment.Data.Length);
while (!segment.LastDataUnit)
{
segment = TPDU.Read(stream);
- output.Write(segment.Data, (int)output.Position, segment.Data.Length);
+ Array.Resize(ref buffer, buffer.Length + segment.Data.Length);
+ var lastPosition = output.Position;
+ output = new MemoryStream(buffer);
+ output.Write(segment.Data, (int) lastPosition, segment.Data.Length);
}
- return output.GetBuffer().Take((int)output.Position).ToArray();
+
+ return buffer.Take((int)output.Position).ToArray();
}
///
@@ -120,15 +124,19 @@ namespace S7.Net
var segment = await TPDU.ReadAsync(stream);
if (segment == null) return null;
- var output = new MemoryStream(segment.Data.Length);
+ var buffer = new byte[segment.Data.Length];
+ var output = new MemoryStream(buffer);
output.Write(segment.Data, 0, segment.Data.Length);
while (!segment.LastDataUnit)
{
segment = await TPDU.ReadAsync(stream);
- output.Write(segment.Data, (int)output.Position, segment.Data.Length);
+ Array.Resize(ref buffer, buffer.Length + segment.Data.Length);
+ var lastPosition = output.Position;
+ output = new MemoryStream(buffer);
+ output.Write(segment.Data, (int) lastPosition, segment.Data.Length);
}
- return output.GetBuffer().Take((int)output.Position).ToArray();
+ return buffer.Take((int)output.Position).ToArray();
}
}
}
diff --git a/S7.Net/Compat/TcpClientMixins.cs b/S7.Net/Compat/TcpClientMixins.cs
new file mode 100644
index 0000000..0b449e1
--- /dev/null
+++ b/S7.Net/Compat/TcpClientMixins.cs
@@ -0,0 +1,19 @@
+using System.Net.Sockets;
+
+namespace S7.Net
+{
+ public static class TcpClientMixins
+ {
+ #if NETSTANDARD1_3
+ public static void Close(this TcpClient tcpClient)
+ {
+ tcpClient.Dispose();
+ }
+
+ public static void Connect(this TcpClient tcpClient, string host, int port)
+ {
+ tcpClient.ConnectAsync(host, port).GetAwaiter().GetResult();
+ }
+ #endif
+ }
+}
diff --git a/S7.Net/PLC.cs b/S7.Net/PLC.cs
index 2bba5e4..80cefba 100644
--- a/S7.Net/PLC.cs
+++ b/S7.Net/PLC.cs
@@ -1,11 +1,5 @@
-using S7.Net.Types;
using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.ComponentModel;
-using System.Linq;
using System.Net.Sockets;
-using System.Threading.Tasks;
namespace S7.Net
@@ -103,7 +97,7 @@ namespace S7.Net
public Plc(CpuType cpu, string ip, Int16 rack, Int16 slot)
{
if (!Enum.IsDefined(typeof(CpuType), cpu))
- throw new InvalidEnumArgumentException(nameof(cpu), (int) cpu, typeof(CpuType));
+ throw new ArgumentException($"The value of argument '{nameof(cpu)}' ({cpu}) is invalid for Enum type '{typeof(CpuType).Name}'.", nameof(cpu));
if (string.IsNullOrEmpty(ip))
throw new ArgumentException("IP address must valid.", nameof(ip));
diff --git a/S7.Net/PLCExceptions.cs b/S7.Net/PLCExceptions.cs
index e3b97eb..c06823b 100644
--- a/S7.Net/PLCExceptions.cs
+++ b/S7.Net/PLCExceptions.cs
@@ -1,9 +1,8 @@
using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Runtime.Serialization;
-using System.Text;
-using System.Threading.Tasks;
+#if NET_FULL
+using System.Runtime.Serialization;
+#endif
+
namespace S7.Net
{
@@ -21,9 +20,11 @@ namespace S7.Net
{
}
+ #if NET_FULL
protected WrongNumberOfBytesException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
+ #endif
}
internal class InvalidAddressException : Exception
@@ -40,9 +41,11 @@ namespace S7.Net
{
}
+ #if NET_FULL
protected InvalidAddressException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
+ #endif
}
internal class InvalidVariableTypeException : Exception
@@ -59,9 +62,11 @@ namespace S7.Net
{
}
+ #if NET_FULL
protected InvalidVariableTypeException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
+ #endif
}
internal class TPKTInvalidException : Exception
@@ -78,8 +83,10 @@ namespace S7.Net
{
}
+ #if NET_FULL
protected TPKTInvalidException(SerializationInfo info, StreamingContext context) : base(info, context)
{
}
+ #endif
}
}
diff --git a/S7.Net/PLCHelpers.cs b/S7.Net/PLCHelpers.cs
index 4bf5753..14e536b 100644
--- a/S7.Net/PLCHelpers.cs
+++ b/S7.Net/PLCHelpers.cs
@@ -1,11 +1,7 @@
using S7.Net.Types;
using System;
-using System.Collections;
using System.Collections.Generic;
-using System.ComponentModel;
using System.Linq;
-using System.Net.Sockets;
-using System.Threading.Tasks;
namespace S7.Net
{
diff --git a/S7.Net/PlcAsynchronous.cs b/S7.Net/PlcAsynchronous.cs
index 0cd32b0..c829963 100644
--- a/S7.Net/PlcAsynchronous.cs
+++ b/S7.Net/PlcAsynchronous.cs
@@ -1,8 +1,6 @@
using S7.Net.Types;
using System;
-using System.Collections;
using System.Collections.Generic;
-using System.ComponentModel;
using System.Linq;
using System.Net.Sockets;
using System.Threading.Tasks;
diff --git a/S7.Net/PlcSynchronous.cs b/S7.Net/PlcSynchronous.cs
index ec092ed..8f1b5bc 100644
--- a/S7.Net/PlcSynchronous.cs
+++ b/S7.Net/PlcSynchronous.cs
@@ -1,11 +1,8 @@
using S7.Net.Types;
using System;
-using System.Collections;
using System.Collections.Generic;
-using System.ComponentModel;
using System.Linq;
using System.Net.Sockets;
-using System.Threading.Tasks;
using S7.Net.Protocol;
//Implement synchronous methods here
diff --git a/S7.Net/S7.Net.csproj b/S7.Net/S7.Net.csproj
index 1bcf18e..1fd6fe5 100644
--- a/S7.Net/S7.Net.csproj
+++ b/S7.Net/S7.Net.csproj
@@ -1,11 +1,13 @@
-
-
+
- net452;netstandard2.0
+ net452;netstandard2.0;netstandard1.3
true
Properties\S7.Net.snk
S7.Net.UnitTest
+
+ NET_FULL
+
\ No newline at end of file
diff --git a/S7.Net/TPKT.cs b/S7.Net/TPKT.cs
index 2b71cec..a3af212 100644
--- a/S7.Net/TPKT.cs
+++ b/S7.Net/TPKT.cs
@@ -1,5 +1,4 @@
using System;
-using System.Net.Sockets;
using System.IO;
using System.Threading.Tasks;
diff --git a/S7.Net/Types/Bit.cs b/S7.Net/Types/Bit.cs
index cd36118..5f00476 100644
--- a/S7.Net/Types/Bit.cs
+++ b/S7.Net/Types/Bit.cs
@@ -1,5 +1,4 @@
-using System;
-using System.Collections;
+using System.Collections;
namespace S7.Net.Types
{
diff --git a/S7.Net/Types/Boolean.cs b/S7.Net/Types/Boolean.cs
index 4c93895..b83369d 100644
--- a/S7.Net/Types/Boolean.cs
+++ b/S7.Net/Types/Boolean.cs
@@ -1,6 +1,4 @@
-using System;
-
-namespace S7.Net.Types
+namespace S7.Net.Types
{
///
/// Contains the methods to read, set and reset bits inside bytes
diff --git a/S7.Net/Types/Class.cs b/S7.Net/Types/Class.cs
index 26f4742..40b73ed 100644
--- a/S7.Net/Types/Class.cs
+++ b/S7.Net/Types/Class.cs
@@ -13,8 +13,8 @@ namespace S7.Net.Types
private static IEnumerable GetAccessableProperties(Type classType)
{
return classType
-#if NETFX_CORE
- .GetProperties().Where(p => p.GetSetMethod() != null);
+#if NETSTANDARD1_3
+ .GetTypeInfo().DeclaredProperties.Where(p => p.SetMethod != null);
#else
.GetProperties(
BindingFlags.SetProperty |
diff --git a/S7.Net/Types/Struct.cs b/S7.Net/Types/Struct.cs
index 9ee05c2..cd88e92 100644
--- a/S7.Net/Types/Struct.cs
+++ b/S7.Net/Types/Struct.cs
@@ -1,6 +1,4 @@
using System;
-using System.Linq;
-using System.Globalization;
using System.Reflection;
namespace S7.Net.Types
@@ -19,8 +17,14 @@ namespace S7.Net.Types
{
double numBytes = 0.0;
- System.Reflection.FieldInfo[] infos = structType.GetFields();
- foreach (System.Reflection.FieldInfo info in infos)
+ var infos = structType
+ #if NETSTANDARD1_3
+ .GetTypeInfo().DeclaredFields;
+ #else
+ .GetFields();
+ #endif
+
+ foreach (var info in infos)
{
switch (info.FieldType.Name)
{
@@ -80,8 +84,15 @@ namespace S7.Net.Types
double numBytes = 0.0;
object structValue = Activator.CreateInstance(structType);
- System.Reflection.FieldInfo[] infos = structValue.GetType().GetFields();
- foreach (System.Reflection.FieldInfo info in infos)
+
+ var infos = structValue.GetType()
+ #if NETSTANDARD1_3
+ .GetTypeInfo().DeclaredFields;
+ #else
+ .GetFields();
+ #endif
+
+ foreach (var info in infos)
{
switch (info.FieldType.Name)
{
@@ -182,8 +193,14 @@ namespace S7.Net.Types
int bitPos = 0;
double numBytes = 0.0;
- System.Reflection.FieldInfo[] infos = type.GetFields();
- foreach (System.Reflection.FieldInfo info in infos)
+ var infos = type
+ #if NETSTANDARD1_3
+ .GetTypeInfo().DeclaredFields;
+ #else
+ .GetFields();
+ #endif
+
+ foreach (var info in infos)
{
bytes2 = null;
switch (info.FieldType.Name)
diff --git a/S7.UniversalWindowsApp.sln b/S7.UniversalWindowsApp.sln
deleted file mode 100644
index 7bdd6d0..0000000
--- a/S7.UniversalWindowsApp.sln
+++ /dev/null
@@ -1,45 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio 14
-VisualStudioVersion = 14.0.24720.0
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7A8252C3-E6AE-435A-809D-4413C06E0711}"
- ProjectSection(SolutionItems) = preProject
- README.md = README.md
- EndProjectSection
-EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "S7.Net.Core", "S7.Net.Core\S7.Net.Core.csproj", "{CBFF80E8-3D3D-4656-A27C-A65EA5774536}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|Any CPU = Debug|Any CPU
- Debug|ARM = Debug|ARM
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|Any CPU = Release|Any CPU
- Release|ARM = Release|ARM
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Debug|Any CPU.Build.0 = Debug|Any CPU
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Debug|ARM.ActiveCfg = Debug|ARM
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Debug|ARM.Build.0 = Debug|ARM
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Debug|x64.ActiveCfg = Debug|x64
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Debug|x64.Build.0 = Debug|x64
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Debug|x86.ActiveCfg = Debug|x86
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Debug|x86.Build.0 = Debug|x86
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Release|Any CPU.ActiveCfg = Release|Any CPU
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Release|Any CPU.Build.0 = Release|Any CPU
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Release|ARM.ActiveCfg = Release|ARM
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Release|ARM.Build.0 = Release|ARM
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Release|x64.ActiveCfg = Release|x64
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Release|x64.Build.0 = Release|x64
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Release|x86.ActiveCfg = Release|x86
- {CBFF80E8-3D3D-4656-A27C-A65EA5774536}.Release|x86.Build.0 = Release|x86
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
-EndGlobal
diff --git a/S7.sln b/S7.sln
index 5a1565d..85c156a 100644
--- a/S7.sln
+++ b/S7.sln
@@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27703.2026
MinimumVisualStudioVersion = 10.0.40219.1
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "S7.Net", "S7.Net\S7.Net.csproj", "{BFD484F9-3F04-42A2-BF2A-60A189A25DCF}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "S7.Net", "S7.Net\S7.Net.csproj", "{BFD484F9-3F04-42A2-BF2A-60A189A25DCF}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{7A8252C3-E6AE-435A-809D-4413C06E0711}"
ProjectSection(SolutionItems) = preProject