internal void WritePrimitiveValue(string symbolPath, object value, Type managedType, AdsDatatypeId dataType, int byteSize, AdsBinaryWriter writer, int writerOffset) { if (string.IsNullOrEmpty(symbolPath)) { throw new ArgumentNullException("symbolPath"); } if (managedType == null) { throw new ArgumentNullException("managedType"); } if (byteSize < 0) { throw new ArgumentOutOfRangeException("byteSize"); } if (writer == null) { throw new ArgumentNullException("writer"); } if (writerOffset < 0) { throw new ArgumentOutOfRangeException("writerOffset"); } Type type = value.GetType(); bool flag2 = PrimitiveTypeConverter.IsPlcOpenType(value.GetType()); if (PrimitiveTypeConverter.IsPlcOpenType(managedType)) { Type tp = null; if (PrimitiveTypeConverter.TryGetManagedType(dataType, out tp)) { managedType = tp; } else if (managedType == typeof(LTIME)) { managedType = typeof(ulong); dataType = AdsDatatypeId.ADST_UINT64; } } if (managedType != type) { try { object obj1 = PrimitiveTypeConverter.Convert(value, managedType); value = obj1; } catch (MarshalException exception) { throw new ArgumentException($"Cannot convert value type '{value.GetType()}' to symbol type '{managedType}'!", "value", exception); } } writer.BaseStream.Position = writerOffset; switch (dataType) { case AdsDatatypeId.ADST_INT16: writer.Write((short)value); return; case AdsDatatypeId.ADST_INT32: writer.Write((int)value); return; case AdsDatatypeId.ADST_REAL32: writer.Write((float)value); return; case AdsDatatypeId.ADST_REAL64: writer.Write((double)value); return; } switch (dataType) { case AdsDatatypeId.ADST_INT8: writer.Write((sbyte)value); return; case AdsDatatypeId.ADST_UINT8: writer.Write((byte)value); return; case AdsDatatypeId.ADST_UINT16: writer.Write((ushort)value); return; case AdsDatatypeId.ADST_UINT32: writer.Write((uint)value); return; case AdsDatatypeId.ADST_INT64: writer.Write((long)value); return; case AdsDatatypeId.ADST_UINT64: writer.Write((ulong)value); return; } switch (dataType) { case AdsDatatypeId.ADST_STRING: { int byteCount = Encoding.Default.GetByteCount("a"); long position = writer.BaseStream.Position; int length = ((string)value).Length; if (((length + 1) * byteCount) > byteSize) { throw AdsErrorException.Create(AdsErrorCode.DeviceInvalidSize); } writer.WritePlcAnsiString((string)value, length); writer.BaseStream.Position = position + byteSize; return; } case AdsDatatypeId.ADST_WSTRING: { int byteCount = Encoding.Unicode.GetByteCount("a"); long position = writer.BaseStream.Position; int length = ((string)value).Length; if (((length + 1) * byteCount) > byteSize) { throw AdsErrorException.Create(AdsErrorCode.DeviceInvalidSize); } writer.WritePlcUnicodeString((string)value, length); writer.BaseStream.Position = position + byteSize; return; } case AdsDatatypeId.ADST_BIT: if ((bool)value) { writer.Write((byte)1); return; } writer.Write((byte)0); return; } throw new ArgumentException("Unexpected datatype. Cannot convert datatype of symbol to this type.", "type"); }