Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
VariantArgBuilder.cs67 linesDownload Raw Back to ComInterop
1// Licensed to the .NET Foundation under one or more agreements.2// The .NET Foundation licenses this file to you under the MIT license.3 4using System;5using System.Linq.Expressions;6using System.Reflection;7using System.Runtime.InteropServices;8 9namespace System.Management.Automation.ComInterop10{11    internal class VariantArgBuilder : SimpleArgBuilder12    {13        private readonly bool _isWrapper;14 15        internal VariantArgBuilder(Type parameterType)16            : base(parameterType)17        {18            _isWrapper = parameterType == typeof(VariantWrapper);19        }20 21        internal override Expression Marshal(Expression parameter)22        {23            // parameter.WrappedObject24            if (_isWrapper)25            {26                parameter = Expression.Property(27                    Helpers.Convert(parameter, typeof(VariantWrapper)),28                    typeof(VariantWrapper).GetProperty(nameof(VariantWrapper.WrappedObject))29                );30            }31 32            return Helpers.Convert(parameter, typeof(object));33        }34 35        internal override Expression MarshalToRef(Expression parameter)36        {37            parameter = Marshal(parameter);38 39            // parameter == UnsafeMethods.GetVariantForObject(parameter);40            return Expression.Call(41                typeof(UnsafeMethods).GetMethod(nameof(UnsafeMethods.GetVariantForObject), BindingFlags.Static | BindingFlags.NonPublic),42                parameter43            );44        }45 46        internal override Expression UnmarshalFromRef(Expression value)47        {48            // value == IntPtr.Zero ? null : Marshal.GetObjectForNativeVariant(value);49 50            Expression unmarshal = Expression.Call(51                typeof(UnsafeMethods).GetMethod(nameof(UnsafeMethods.GetObjectForVariant)),52                value53            );54 55            if (_isWrapper)56            {57                unmarshal = Expression.New(58                    typeof(VariantWrapper).GetConstructor(new Type[] { typeof(object) }),59                    unmarshal60                );61            }62 63            return base.UnmarshalFromRef(unmarshal);64        }65    }66}67