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.Runtime.InteropServices;7 8namespace System.Management.Automation.ComInterop9{10 internal class DispatchArgBuilder : SimpleArgBuilder11 {12 private readonly bool _isWrapper;13 14 internal DispatchArgBuilder(Type parameterType)15 : base(parameterType)16 {17 _isWrapper = parameterType == typeof(DispatchWrapper);18 }19 20 internal override Expression Marshal(Expression parameter)21 {22 parameter = base.Marshal(parameter);23 24 // parameter.WrappedObject25 if (_isWrapper)26 {27 parameter = Expression.Property(28 Helpers.Convert(parameter, typeof(DispatchWrapper)),29 typeof(DispatchWrapper).GetProperty(nameof(DispatchWrapper.WrappedObject))30 );31 }32 33 return Helpers.Convert(parameter, typeof(object));34 }35 36 internal override Expression MarshalToRef(Expression parameter)37 {38 parameter = Marshal(parameter);39 40 // parameter == null ? IntPtr.Zero : Marshal.GetIDispatchForObject(parameter);41 return Expression.Condition(42 Expression.Equal(parameter, Expression.Constant(null)),43 Expression.Constant(IntPtr.Zero),44 Expression.Call(45 typeof(Marshal).GetMethod(nameof(System.Runtime.InteropServices.Marshal.GetIDispatchForObject)),46 parameter47 )48 );49 }50 51 internal override Expression UnmarshalFromRef(Expression value)52 {53 // value == IntPtr.Zero ? null : Marshal.GetObjectForIUnknown(value);54 Expression unmarshal = Expression.Condition(55 Expression.Equal(value, Expression.Constant(IntPtr.Zero)),56 Expression.Constant(null),57 Expression.Call(58 typeof(Marshal).GetMethod(nameof(System.Runtime.InteropServices.Marshal.GetObjectForIUnknown)),59 value60 )61 );62 63 if (_isWrapper)64 {65 unmarshal = Expression.New(66 typeof(DispatchWrapper).GetConstructor(new Type[] { typeof(object) }),67 unmarshal68 );69 }70 71 return base.UnmarshalFromRef(unmarshal);72 }73 }74}75 