I'm trying to do this helper function for P/Invoking, the purpose is help determining which should be the most appropriated managed type to declare for specific marshalings of a windows API definition.
I've taken the info from here: UnmanagedType Enumeration
In C# or Vb.Net, I ask for help to fill the emptyness Cases and to fix my current errors, if any.
( Also, as an optional and orientative question to answer or not: Do you think could be reliable to write the opposite?, a sort of ManagedTypeToUnmanagedTypeEnum
function. )
Public Shared Function UnmanagedTypeToManagedType(ByVal [type] As UnmanagedType) As Type
Select Case [type]
Case UnmanagedType.AnsiBStr
Return GetType(String)
Case UnmanagedType.AsAny
Return GetType(Object)
Case UnmanagedType.BStr
Return GetType(String)
Case UnmanagedType.Bool
Return GetType(Boolean)
Case UnmanagedType.ByValArray
Case UnmanagedType.ByValTStr
Case UnmanagedType.Currency
Return GetType(Decimal)
Case UnmanagedType.CustomMarshaler
Return GetType(Object)
Case UnmanagedType.Error
Return GetType(IntPtr)
Case UnmanagedType.FunctionPtr
Return GetType([Delegate])
Case UnmanagedType.I1
Return GetType(SByte)
Case UnmanagedType.I2
Return GetType(Short)
Case UnmanagedType.I4
Return GetType(Integer)
Case UnmanagedType.I8
Return GetType(Long)
Case UnmanagedType.IDispatch
Return GetType(IntPtr)
Case UnmanagedType.Interface
Return GetType(IntPtr)
Case UnmanagedType.IUnknown
Return GetType(IntPtr)
Case UnmanagedType.LPArray
Return GetType(IntPtr)
Case UnmanagedType.LPStr
Return GetType(StringBuilder)
Case UnmanagedType.LPStruct
Return GetType(IntPtr)
Case UnmanagedType.LPTStr
Return GetType(String)
Case UnmanagedType.LPWStr
Return GetType(String)
Case UnmanagedType.R4
Case UnmanagedType.R8
Case UnmanagedType.SafeArray
Case UnmanagedType.Struct
Case UnmanagedType.SysInt
Return GetType(IntPtr)
Case UnmanagedType.SysUInt
Return GetType(UIntPtr)
Case UnmanagedType.TBStr
Return GetType(String)
Case UnmanagedType.U1
Return GetType(Byte)
Case UnmanagedType.U2
Return GetType(UShort)
Case UnmanagedType.U4
Return GetType(UInteger)
Case UnmanagedType.U8
Return GetType(ULong)
Case UnmanagedType.VariantBool
Return GetType(Boolean)
Case UnmanagedType.VBByRefStr
Return GetType(String)
Case Else
Throw New InvalidEnumArgumentException(argumentName:="type", invalidValue:=[type],
enumClass:=GetType(UnmanagedType))
Return Nothing
End Select
End Function