MegaBites-AI/Windows-powershell
0372
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 