コード例 #1
0
        private XDRPCArrayArgumentInfo <T> .ArrayElementData GenerateArrayBufferData(
            XDRPCArgumentInfo info,
            ref int referenceOffset)
        {
            XDRPCArrayArgumentInfo <T> .ArrayElementData arrayElementData = new XDRPCArrayArgumentInfo <T> .ArrayElementData();

            arrayElementData.Info            = info;
            arrayElementData.ReferenceOffset = referenceOffset;
            arrayElementData.ReferenceSize   = info.GetRequiredReferenceSize();
            referenceOffset += arrayElementData.ReferenceSize;
            XDRPCExecutionState.AlignBufferOffset(ref referenceOffset);
            return(arrayElementData);
        }
コード例 #2
0
 private object UnpackValuesRecursive(
     Type structType,
     object structToMarshal,
     ref List <XDRPCStructArgumentInfo <T> .StructBufferData> .Enumerator bufferEnum)
 {
     foreach (FieldInfo field in structType.GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic))
     {
         Type fieldType = field.FieldType;
         XDRPCStructArgumentInfo <T> .StructBufferData structBufferData = bufferEnum.Current;
         if (fieldType == typeof(string) || fieldType.IsArray || fieldType.IsPrimitive)
         {
             if (structBufferData.ReferenceIndex != -1)
             {
                 if (structBufferData.Info.GetRequiredReferenceSize() == 0)
                 {
                     structBufferData = this._referenceBufferDataList[structBufferData.ReferenceIndex];
                 }
                 if (structBufferData.Info.GetRequiredReferenceSize() > 0)
                 {
                     XDRPCArrayArgumentInfo <byte[]> info = (XDRPCArrayArgumentInfo <byte[]>) this._referenceBufferDataList[structBufferData.ReferenceIndex].Info;
                     structBufferData.Info.UnpackReferenceData(info.Value);
                 }
             }
             object obj = this.ValidateArgInfoNullValue(fieldType, structBufferData.Info);
             field.SetValue(structToMarshal, obj);
             bufferEnum.MoveNext();
         }
         else if (fieldType.IsValueType)
         {
             object obj;
             if (structBufferData.ReferenceIndex != -1)
             {
                 List <XDRPCStructArgumentInfo <T> .StructBufferData> .Enumerator enumerator = this._referenceBufferDataList.GetEnumerator();
                 do
                 {
                     enumerator.MoveNext();
                 }while (enumerator.Current.Info != this._referenceBufferDataList[structBufferData.ReferenceIndex].Info);
                 obj = this.UnpackValuesRecursive(fieldType, field.GetValue(structToMarshal), ref enumerator);
                 bufferEnum.MoveNext();
             }
             else
             {
                 obj = this.UnpackValuesRecursive(fieldType, field.GetValue(structToMarshal), ref bufferEnum);
             }
             field.SetValue(structToMarshal, obj);
         }
     }
     return(structToMarshal);
 }