Esempio n. 1
0
        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(" *");
            }
        }
Esempio n. 2
0
        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(" *");
        }
Esempio n. 3
0
        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();
            }
        }