Team Ai
Datasetpublic

MegaBites-AI/Windows-powershell

sourceHugging Facemitupdated 6mo agoView on Hugging Face
0likes372downloads
StringArgBuilder.cs73 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.Diagnostics;6using System.Linq.Expressions;7using System.Runtime.InteropServices;8 9namespace System.Management.Automation.ComInterop10{11    internal class StringArgBuilder : SimpleArgBuilder12    {13        private readonly bool _isWrapper;14 15        internal StringArgBuilder(Type parameterType)16            : base(parameterType)17        {18            Debug.Assert(parameterType == typeof(string) || parameterType == typeof(BStrWrapper));19            _isWrapper = parameterType == typeof(BStrWrapper);20        }21 22        internal override Expression Marshal(Expression parameter)23        {24            parameter = base.Marshal(parameter);25 26            // parameter.WrappedObject27            if (_isWrapper)28            {29                parameter = Expression.Property(30                    Helpers.Convert(parameter, typeof(BStrWrapper)),31                    typeof(BStrWrapper).GetProperty(nameof(BStrWrapper.WrappedObject))32                );33            }34 35            return parameter;36        }37 38        internal override Expression MarshalToRef(Expression parameter)39        {40            parameter = Marshal(parameter);41 42            // Marshal.StringToBSTR(parameter)43            return Expression.Call(44                typeof(Marshal).GetMethod(nameof(System.Runtime.InteropServices.Marshal.StringToBSTR)),45                parameter46            );47        }48 49        internal override Expression UnmarshalFromRef(Expression value)50        {51            // value == IntPtr.Zero ? null : Marshal.PtrToStringBSTR(value);52            Expression unmarshal = Expression.Condition(53                Expression.Equal(value, Expression.Constant(IntPtr.Zero)),54                Expression.Constant(null, typeof(string)),   // default value55                Expression.Call(56                    typeof(Marshal).GetMethod(nameof(System.Runtime.InteropServices.Marshal.PtrToStringBSTR)),57                    value58                )59            );60 61            if (_isWrapper)62            {63                unmarshal = Expression.New(64                    typeof(BStrWrapper).GetConstructor(new Type[] { typeof(string) }),65                    unmarshal66                );67            }68 69            return base.UnmarshalFromRef(unmarshal);70        }71    }72}73