Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
UnknownArgBuilder.cs75 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.Runtime.InteropServices;7 8namespace System.Management.Automation.ComInterop9{10    internal class UnknownArgBuilder : SimpleArgBuilder11    {12        private readonly bool _isWrapper;13 14        internal UnknownArgBuilder(Type parameterType)15            : base(parameterType)16        {17            _isWrapper = parameterType == typeof(UnknownWrapper);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(UnknownWrapper)),29                    typeof(UnknownWrapper).GetProperty(nameof(UnknownWrapper.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.GetIUnknownForObject(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.GetIUnknownForObject)),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(UnknownWrapper).GetConstructor(new Type[] { typeof(object) }),67                    unmarshal68                );69            }70 71            return base.UnmarshalFromRef(unmarshal);72        }73    }74}75