【发布时间】:2016-04-05 23:43:44
【问题描述】:
我正在尝试为 P/Invoking 执行此辅助函数,目的是帮助确定哪个应该是最适合为 Windows API 定义的特定编组声明的托管类型。
我从这里获取了信息: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 知道托管类型和非托管类型之间没有一对一的映射,因为他/她要求最合适的类型。问题是从托管类型和非托管类型之间的多对多映射,构造一个典型的一对一映射。由于 OP 没有说明他/她为什么想要这样的功能或它将用于什么,所以很难知道它是否完全没用。
-
@Hadi 请定义“最合适的类型”。令我惊讶的是,您在不了解此地图的应用的情况下能够做到这一点。
-
@DavidHeffernan 好吧,如果您浏览文档,您会发现超过一半的非托管类型只对应一种托管类型。其余的对应于 System.Object、System.Delegate 或 System.Array。当然,确切的类型取决于被调用的函数。但是您不认为这种映射总体上有意义吗? OP 现在可以根据需要尝试它,看看它是否有效。
-
您应该在必要时告诉用户,确切的托管类型取决于所使用的非托管 API。我的回答中突出显示了模棱两可的地方。
标签: c# .net vb.net winapi unmanaged