public ResolvedServiceEntry ResolveEntry(IResolutionServices services, IResolvableType resolvableType) { ServiceEntry entry = resolvableType.ToServiceEntry(services); using (entry.Lock.AcquireReaderLock()) { /* Never want to auto create activator for the entry we created above. */ if (entry.CanHaveActivator) { CreateActivatorForEntryIfNecessary(services, entry); } } IActivator activator = _activatorResolver.ResolveActivator(services, entry); if (activator == null) { return null; } return new ResolvedServiceEntry(entry, activator, services.ObjectInstances); }
public override void WriteValue(ISymbol symbol, object value, out DateTime utcWriteTime) { if (symbol == null) { throw new ArgumentNullException("symbol"); } if (value == null) { throw new ArgumentNullException("value"); } int num = 0; ISymbol symbol2 = symbol; IDataType dataType = symbol2.DataType; IResolvableType type2 = dataType as IResolvableType; if (type2 != null) { dataType = type2.ResolveType(DataTypeResolveStrategy.AliasReference); } utcWriteTime = DateTime.MinValue; if (dataType.IsBitType) { num = this.tryWriteValue(symbol2, BitTypeConverter.Marshal(dataType.BitSize, value), 0, out utcWriteTime); } else if (!symbol2.IsPrimitiveType) { DynamicValue value2 = (DynamicValue)value; num = this.TryWriteValue(value2, out utcWriteTime); } else if (((dataType.Category == DataTypeCategory.Primitive) || (dataType.Category == DataTypeCategory.SubRange)) || (dataType.Category == DataTypeCategory.Pointer)) { num = this.tryWriteValue(symbol2, PrimitiveTypeConverter.Default.Marshal(symbol2.DataType, value), 0, out utcWriteTime); } else if (dataType.Category == DataTypeCategory.String) { IStringType type3 = (IStringType)symbol2.DataType; byte[] buffer3 = new PrimitiveTypeConverter(type3.Encoding).Marshal(symbol2.DataType, value); if (buffer3.Length >= type3.Size) { Exception ex = new AdsErrorException($"String is too large for symbol '{symbol2.InstancePath}' (Type: {symbol2.TypeName}).", AdsErrorCode.DeviceInvalidSize); Module.Trace.TraceError(ex); throw ex; } num = this.tryWriteValue(symbol2, buffer3, 0, out utcWriteTime); } else if (dataType.Category == DataTypeCategory.Array) { IArrayType type4 = (IArrayType)symbol2.DataType; num = this.tryWriteValue(symbol2, PrimitiveTypeConverter.Default.Marshal(symbol2.DataType, value), 0, out utcWriteTime); } else { if (dataType.Category != DataTypeCategory.Enum) { Exception ex = new SymbolException($"Could not write Symbol '{symbol2.InstancePath}' (Type: {symbol2.TypeName}). Category mismatch!", symbol2); Module.Trace.TraceError(ex); throw ex; } IEnumType type5 = (IEnumType)symbol2.DataType; num = this.tryWriteValue(symbol2, PrimitiveTypeConverter.Default.Marshal(symbol2.DataType, value), 0, out utcWriteTime); } if (num != 0) { Exception ex = new SymbolException($"Could not write Symbol '{symbol2.InstancePath}' (Type: {symbol2.TypeName})! Error: {num}", symbol2); Module.Trace.TraceError(ex); throw ex; } }