Я пытаюсь выполнить эту вспомогательную функцию для P/Invoking, целью которой является определение того, какой должен быть наиболее подходящий управляемый тип для объявления определенных маршалингов определения API Windows ,Перевести значения перечисления UnmanagedType на их эквиваленты управляемого типа
Я взял информацию здесь: UnmanagedType Enumeration
В C# или VB.NET, я прошу помощи, чтобы заполнить пустота футляры и исправить свои текущие ошибки, если таковые имеются.
(Кроме того, в качестве опции и ориентировочной вопрос отвечать или нет: Как вы думаете, может быть надежным, чтобы написать обратное ?, своего рода ManagedTypeToUnmanagedTypeEnum
функции.)
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
Этот вопрос основан на ошибочной предпосылке. Семантика параметра не задается по типу. Между управляемыми и неуправляемыми типами нет однозначного сопоставления. Функции, которые вы пытаетесь построить, бесполезны. –
@DavidHeffernan OP знает, что между управляемыми и неуправляемыми типами нет однозначного сопоставления, потому что он попросил ** наиболее подходящий тип **. Вопрос в том, что из сопоставления «много-во» между управляемыми и неуправляемыми типами построение типичного сопоставления «один-к-одному». Поскольку ОП не уточнил, почему он хочет такую функцию или для чего ее будут использовать, трудно понять, является ли она совершенно бесполезной или нет. –
@Hadi Пожалуйста, определите «наиболее подходящий тип». Я поражен тем, что вам удалось это сделать, не зная о применении этой карты. –