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.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 