private void _Convert() { VarEnum vt = (VarEnum)m_typeDesc.vt; // Strip out VT_PTR while (vt == VarEnum.VT_PTR) { m_typeDesc = m_typeDesc.lptdesc; vt = (VarEnum)m_typeDesc.vt; m_nativeIndirections++; } // Strip out VT_BYREF if ((vt & VarEnum.VT_BYREF) != 0) { vt &= ~VarEnum.VT_BYREF; m_nativeIndirections++; } // // Find the corresponding type and save it in result and store the custom attribute in m_attribute // switch (vt) { case VarEnum.VT_INT: m_typeStringBuilder.Append("INT"); break; case VarEnum.VT_UINT: m_typeStringBuilder.Append("UINT"); break; case VarEnum.VT_UI1: m_typeStringBuilder.Append("BYTE"); break; case VarEnum.VT_UI2: m_typeStringBuilder.Append("USHORT"); break; case VarEnum.VT_UI4: m_typeStringBuilder.Append("UINT"); break; case VarEnum.VT_UI8: m_typeStringBuilder.Append("ULONG"); break; case VarEnum.VT_I1: m_typeStringBuilder.Append("SBYTE"); break; case VarEnum.VT_I2: m_typeStringBuilder.Append("SHORT"); break; case VarEnum.VT_I4: m_typeStringBuilder.Append("INT"); break; case VarEnum.VT_I8: m_typeStringBuilder.Append("LONG"); break; case VarEnum.VT_R4: m_typeStringBuilder.Append("FLOAT"); break; case VarEnum.VT_R8: m_typeStringBuilder.Append("DOUBLE"); break; case VarEnum.VT_ERROR: m_typeStringBuilder.Append("SCODE"); break; case VarEnum.VT_HRESULT: m_typeStringBuilder.Append("HRESULT"); break; case VarEnum.VT_VOID: m_typeStringBuilder.Append("void"); break; case VarEnum.VT_BSTR: m_typeStringBuilder.Append("BSTR"); break; case VarEnum.VT_DISPATCH: m_typeStringBuilder.Append("IDispatch *"); // VT_DISPATCH => IDispatch * break; case VarEnum.VT_UNKNOWN: m_typeStringBuilder.Append("IUnknown *"); // VT_UNKNOWN => IUnknown * break; case VarEnum.VT_LPSTR: m_typeStringBuilder.Append("LPSTR"); break; case VarEnum.VT_LPWSTR: m_typeStringBuilder.Append("LPWSTR"); break; case VarEnum.VT_PTR: Debug.Assert(false, "Should not get here"); break; case VarEnum.VT_VARIANT: m_typeStringBuilder.Append("VARIANT"); break; case VarEnum.VT_CY: m_typeStringBuilder.Append("CURRENCY"); break; case VarEnum.VT_DATE: m_typeStringBuilder.Append("DATE"); break; case VarEnum.VT_DECIMAL: m_typeStringBuilder.Append("DECIMAL"); break; case VarEnum.VT_BOOL: m_typeStringBuilder.Append("VARIANT_BOOL"); break; case VarEnum.VT_CARRAY: { TypeDesc elemTypeDesc = m_typeDesc.lptdesc; TlbType2String elemTypeConverter = new TlbType2String(m_interfaceType, elemTypeDesc); string elementTypeString = elemTypeConverter.GetTypeString(); uint elements = 1; SAFEARRAYBOUND[] bounds = m_typeDesc.lpadesc.Bounds; foreach (SAFEARRAYBOUND bound in bounds) { elements *= bound.cElements; } // SizeConst can only hold Int32.MaxValue m_typeStringBuilder.Append(elementTypeString); m_typeStringBuilder.Append(" ["); m_typeStringBuilder.Append(elements); m_typeStringBuilder.Append(']'); } break; case VarEnum.VT_SAFEARRAY: // TODO(yifeng) m_typeStringBuilder.Append("SAFEARRAY"); break; case VarEnum.VT_RECORD: case VarEnum.VT_USERDEFINED: // Handle structs, interfaces, enums, and unions TypeInfo realType; try { realType = m_typeDesc.GetUserDefinedTypeInfo(m_interfaceType); string typeString = "[" + realType.GetContainingTypeLib().GetDocumentation() + "]" + realType.GetDocumentation(); m_typeStringBuilder.Append(typeString); //NativeType2String.AddNativeUserDefinedType(typeString); } catch (Exception) { m_typeStringBuilder.Append("USERDEFINED"); } break; default: // TODO(yifeng) m_typeStringBuilder.Append("NONE"); break; } for (int i = 0; i < m_nativeIndirections; i++) { m_typeStringBuilder.Append(" *"); } }
private void _Convert() { VarEnum vt = (VarEnum)m_typeDesc.vt; // Strip out VT_PTR while (vt == VarEnum.VT_PTR) { m_typeDesc = m_typeDesc.lptdesc; vt = (VarEnum)m_typeDesc.vt; m_nativeIndirections++; } // Strip out VT_BYREF if ((vt & VarEnum.VT_BYREF) != 0) { vt &= ~VarEnum.VT_BYREF; m_nativeIndirections++; } // // Find the corresponding type and save it in result and store the custom attribute in m_attribute // switch (vt) { case VarEnum.VT_INT: m_typeStringBuilder.Append("INT"); break; case VarEnum.VT_UINT: m_typeStringBuilder.Append("UINT"); break; case VarEnum.VT_UI1: m_typeStringBuilder.Append("BYTE"); break; case VarEnum.VT_UI2: m_typeStringBuilder.Append("USHORT"); break; case VarEnum.VT_UI4: m_typeStringBuilder.Append("UINT"); break; case VarEnum.VT_UI8: m_typeStringBuilder.Append("ULONG"); break; case VarEnum.VT_I1: m_typeStringBuilder.Append("SBYTE"); break; case VarEnum.VT_I2: m_typeStringBuilder.Append("SHORT"); break; case VarEnum.VT_I4: m_typeStringBuilder.Append("INT"); break; case VarEnum.VT_I8: m_typeStringBuilder.Append("LONG"); break; case VarEnum.VT_R4: m_typeStringBuilder.Append("FLOAT"); break; case VarEnum.VT_R8: m_typeStringBuilder.Append("DOUBLE"); break; case VarEnum.VT_ERROR : m_typeStringBuilder.Append("SCODE"); break; case VarEnum.VT_HRESULT: m_typeStringBuilder.Append("HRESULT"); break; case VarEnum.VT_VOID: m_typeStringBuilder.Append("void"); break; case VarEnum.VT_BSTR: m_typeStringBuilder.Append("BSTR"); break; case VarEnum.VT_DISPATCH: m_typeStringBuilder.Append("IDispatch *"); // VT_DISPATCH => IDispatch * break; case VarEnum.VT_UNKNOWN: m_typeStringBuilder.Append("IUnknown *"); // VT_UNKNOWN => IUnknown * break; case VarEnum.VT_LPSTR: m_typeStringBuilder.Append("LPSTR"); break; case VarEnum.VT_LPWSTR: m_typeStringBuilder.Append("LPWSTR"); break; case VarEnum.VT_PTR: Debug.Assert(false, "Should not get here"); break; case VarEnum.VT_VARIANT: m_typeStringBuilder.Append("VARIANT"); break; case VarEnum.VT_CY: m_typeStringBuilder.Append("CURRENCY"); break; case VarEnum.VT_DATE: m_typeStringBuilder.Append("DATE"); break; case VarEnum.VT_DECIMAL: m_typeStringBuilder.Append("DECIMAL"); break; case VarEnum.VT_BOOL: m_typeStringBuilder.Append("VARIANT_BOOL"); break; case VarEnum.VT_CARRAY: { TypeDesc elemTypeDesc = m_typeDesc.lptdesc; TlbType2String elemTypeConverter = new TlbType2String(m_interfaceType, elemTypeDesc); string elementTypeString = elemTypeConverter.GetTypeString(); uint elements = 1; SAFEARRAYBOUND[] bounds = m_typeDesc.lpadesc.Bounds; foreach (SAFEARRAYBOUND bound in bounds) { elements *= bound.cElements; } // SizeConst can only hold Int32.MaxValue m_typeStringBuilder.Append(elementTypeString); m_typeStringBuilder.Append(" ["); m_typeStringBuilder.Append(elements); m_typeStringBuilder.Append(']'); } break; case VarEnum.VT_SAFEARRAY: // TODO(yifeng) m_typeStringBuilder.Append("SAFEARRAY"); break; case VarEnum.VT_RECORD: case VarEnum.VT_USERDEFINED: // Handle structs, interfaces, enums, and unions try { TypeInfo realType = m_typeDesc.GetUserDefinedTypeInfo(m_interfaceType); string typeString = "[" + realType.GetContainingTypeLib().GetDocumentation() + "]" + realType.GetDocumentation(); m_typeStringBuilder.Append(typeString); //NativeType2String.AddNativeUserDefinedType(typeString); } catch (Exception) { m_typeStringBuilder.Append("USERDEFINED"); } break; default: // TODO(yifeng) m_typeStringBuilder.Append("NONE"); break; } for (int i = 0; i < m_nativeIndirections; i++) m_typeStringBuilder.Append(" *"); }
private static void GetTypeFromConvertToAction(SignatureInfoMatchTarget target, ConvertToAction convertToAction, ConverterInfo converterInfo, TypeInfo typeInfo, TypeDesc typeDesc, out Type typeReturn, out CustomAttributeBuilder customAttribute, out ParameterAttributes fixedParameterAttributes) { typeReturn = null; customAttribute = null; fixedParameterAttributes = ParameterAttributes.None; ParameterDirection direction = ConvertToActionConstants.GetParameterDirection(convertToAction.Direction); switch (direction) { case ParameterDirection.IN: fixedParameterAttributes |= ParameterAttributes.In; break; case ParameterDirection.OUT: fixedParameterAttributes |= ParameterAttributes.Out; break; case ParameterDirection.INOUT: fixedParameterAttributes |= ParameterAttributes.In; fixedParameterAttributes |= ParameterAttributes.Out; break; } Dictionary<string, string> attributePairDictionary = ConvertToAction.GetConvertToAttributeDictionary(convertToAction.Attributes); ManagedTypeConvertTo managedType = ConvertToActionConstants.GetManagedTypeConvertTo(convertToAction.ManagedTypeConvertTo); UnmanagedType marshalAs = ConvertToActionConstants.GetMarshalAs(convertToAction.UnmanagedTypeMarshalAs); switch (managedType) { case ManagedTypeConvertTo.LPARRAY: if ((VarEnum)typeDesc.vt == VarEnum.VT_CARRAY || (VarEnum)typeDesc.vt == VarEnum.VT_PTR) { TypeConverter elemTypeConverter = new TypeConverter(converterInfo, typeInfo, typeDesc.lptdesc, ConversionType.Element); Type elemType = elemTypeConverter.ConvertedType; typeReturn = elemType.MakeArrayType(); if (attributePairDictionary.ContainsKey(ConvertToActionDef.SizeConst)) { customAttribute = CustomAttributeHelper.GetBuilderForMarshalAsConstArray(UnmanagedType.LPArray, Int32.Parse(attributePairDictionary[ConvertToActionDef.SizeConst].ToString())); } else if (attributePairDictionary.ContainsKey(ConvertToActionDef.SizeParamIndex)) { customAttribute = CustomAttributeHelper.GetBuilderForMarshalAsConstArrayBySizeParamIndex( UnmanagedType.LPArray, Int16.Parse(attributePairDictionary[ConvertToActionDef.SizeParamIndex].ToString())); } else if (attributePairDictionary.ContainsKey(ConvertToActionDef.SizeParamIndexOffset)) { customAttribute = CustomAttributeHelper.GetBuilderForMarshalAsConstArrayBySizeParamIndex( UnmanagedType.LPArray, (short)((target.NativeParameterIndex) - 1 + Int16.Parse(attributePairDictionary[ConvertToActionDef.SizeParamIndexOffset].ToString()))); } else { customAttribute = CustomAttributeHelper.GetBuilderForMarshalAs(UnmanagedType.LPArray); } } else { string targetTypeString = new TlbType2String(typeInfo, typeDesc).GetTypeString(); throw new TlbImpGeneralException(Resource.FormatString("Err_ConvertNonArrayToArray", targetTypeString), ErrorCode.Err_ConvertNonArrayToArray); } break; case ManagedTypeConvertTo.DECIMAL: typeReturn = typeof(Decimal); if (marshalAs != (UnmanagedType)(-1)) customAttribute = CustomAttributeHelper.GetBuilderForMarshalAs(marshalAs); break; case ManagedTypeConvertTo.INT: typeReturn = typeof(int); if (marshalAs != (UnmanagedType)(-1)) customAttribute = CustomAttributeHelper.GetBuilderForMarshalAs(marshalAs); break; case ManagedTypeConvertTo.OBJECT: typeReturn = typeof(object); if (marshalAs != (UnmanagedType)(-1)) customAttribute = CustomAttributeHelper.GetBuilderForMarshalAs(marshalAs); break; case ManagedTypeConvertTo.STRING: typeReturn = typeof(string); if (marshalAs != (UnmanagedType)(-1)) customAttribute = CustomAttributeHelper.GetBuilderForMarshalAs(marshalAs); break; case ManagedTypeConvertTo.STRINGBUILDER: typeReturn = typeof(StringBuilder); if (marshalAs != (UnmanagedType)(-1)) customAttribute = CustomAttributeHelper.GetBuilderForMarshalAs(marshalAs); break; } if (convertToAction.ByRef) { typeReturn = typeReturn.MakeByRefType(); } }