protected override int OnUnmarshalParameter(int i, RpcMethodParameterCollection outParameters, IList <IDataType> outParameterTypes, byte[] buffer, int offset, ref object[] outValues) { ITcAdsDataType dataType = (ITcAdsDataType)outParameterTypes[i]; object obj2 = outValues[i]; return(this.unmarshal(buffer, offset, dataType, out obj2)); }
protected override int OnMarshalParameter(int i, RpcMethodParameterCollection inParameters, IList <IDataType> inParameterTypes, object[] parameterValues, byte[] buffer, int offset) { ITcAdsDataType type = (ITcAdsDataType)inParameterTypes[i]; object val = parameterValues[i]; AdsDatatypeId dataTypeId = type.DataTypeId; int num = 0; if (PrimitiveTypeConverter.CanMarshal(type.Category)) { byte[] data = null; PrimitiveTypeConverter.Marshal(dataTypeId, val, out data); num = copyHelper(buffer, offset, data); } else { if (type.Category != DataTypeCategory.String) { throw new MarshalException($"Cannot marshal complex type '{type.Name}'"); } int length = -1; bool isUnicode = false; DataTypeStringParser.TryParseString(type.Name, out length, out isUnicode); string str = (string)val; byte[] source = null; PlcStringConverter converter = isUnicode ? PlcStringConverter.UnicodeVariableLength : PlcStringConverter.DefaultVariableLength; if (converter.MarshalSize(str) > type.ByteSize) { throw new MarshalException("String size mismatch"); } source = converter.Marshal(str); num = copyHelper(buffer, offset, source); } return(num); }
internal RpcMethod(AdsMethodEntry entry) { if (entry == null) { throw new ArgumentNullException("entry"); } this._name = entry.name; List <IRpcMethodParameter> coll = new List <IRpcMethodParameter>(); if (entry.parameters != null) { for (int i = 0; i < entry.parameters.Length; i++) { RpcMethodParameter item = new RpcMethodParameter(entry.parameters[i]); coll.Add(item); } } this._parameters = new RpcMethodParameterCollection(coll); this._returnAlignSize = (int)entry.returnAlignSize; this._returnTypeSize = (int)entry.returnSize; this._returnType = entry.returnType; this._vTableIndex = (int)entry.vTableIndex; this._comment = entry.comment; }