框架更改导致异常:无法封送'':无效的托管/非托管类型组合......?

时间:2010-07-08 07:22:47

标签: .net .net-4.0

从我的托管代码(让我们称之为MyLib)我使用的是一个库(让我们称之为OtherLib),它基本上是一些c ++代码的包装器(我从未见过包装器代码或者有权访问它的源代码,也没有我会拥有它吗。

当我的调用库正在瞄准3.5框架时,一切都很好,花花公子。当我将它作为目标.NET 4.0时,我在使用OtherLib中的方法时遇到此异常:

无法编组'参数#3':无效的托管/非托管类型组合(此值类型必须与Struct配对)。

当我在包装器提供的某种类型上调用方法时会发生这种情况。在第4行,我得到了上述异常。

            If results.Compute(coordOrg, True, Nothing) Then
                 For Each Coord As Coordinate3D In queueDest
                    resDM(fromIndex, Coord.zMeter, DistanceCostType.CrowFly) = Math.Round(Math.Sqrt(Math.Pow(pointFrom.X - Coord.xMeterOrLongDeg, 2) + Math.Pow(pointFrom.Y - Coord.yMeterOrLatDeg, 2)) / 1000, 6)
                    resDM(fromIndex, Coord.zMeter, DistanceCostType.Road) = Math.Round(results.GetCost(Coord, m_itiDistance) / 100000, 6)
                    resDM(fromIndex, Coord.zMeter, DistanceCostType.Time) = Math.Round(results.GetCost(Coord, m_itiTime) / 100 / 60, 4)
                Next
            End If

有没有人遇到过类似的东西?

编辑: 我已经尝试将目标从3.5切换到4.0并再次返回。在3.5下,所有工作都在4.0以下,它会引发此异常。 我尝试创建一个目标为3.5的包装器项目,公开一个从OtherLib检索结果的静态类。再次,当我从编译为4.0的项目调用它时,它失败并在编译为3.5

时工作

EDIT2:枚举定义

Public Enum DistanceCostType
    CrowFly
    Road
    Time
End Enum

2 个答案:

答案 0 :(得分:2)

:)似乎没有多少人遇到过这个具体问题,但我就是其中之一!我的OpenCL绑定有这个问题,我不知道解决它。有没有人设法获得有关此问题的修复或进一步信息?

以下是P / Invoke定义(最后一个参数是问题)。还有一个详细的讨论,在openclnet.codeplex.com的“讨论”选项卡中(在“为您进行的新测试”下)重现问题。

Cl.Event是一个具有单个IntPtr成员的结构。

http://openclnet.codeplex.com/SourceControl/changeset/view/77409#1251581(寻找“struct Event”)。

  1. 下面的一个适用于.NET 4.0但不适用于它下面的版本,但错误(无法编组'参数#9':无效的托管/非托管类型组合(Int / UInt必须与SysInt或SysUInt配对) )

    [DllImport(Library)]
    private static extern ErrorCode clEnqueueWriteBuffer(IntPtr commandQueue,
                                                         IntPtr buffer,
                                                         Bool blockingWrite,
                                                         IntPtr offset,
                                                         IntPtr cb,
                                                         IntPtr ptr,
                                                         uint numEventsInWaitList,
                                                         [In] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.SysUInt, SizeParamIndex = 6)] Event[] eventWaitList,
                                                         [Out] [MarshalAs(UnmanagedType.Struct)] out Event e);
    
  2. 这个适用于.NET 3.5及更低版本,但在.NET 4.0上失败并出现错误(无法编组'参数#9':无效的托管/非托管类型组合(Int / UInt必须与Struct配对) )

    [DllImport(Library)]
    private static extern ErrorCode clEnqueueWriteBuffer(IntPtr commandQueue,
                                                         IntPtr buffer,
                                                         Bool blockingWrite,
                                                         IntPtr offset,
                                                         IntPtr cb,
                                                         IntPtr ptr,
                                                         uint numEventsInWaitList,
                                                         [In] [MarshalAs(UnmanagedType.LPArray, ArraySubType = UnmanagedType.SysUInt, SizeParamIndex = 6)] Event[] eventWaitList,
                                                         [Out] [MarshalAs(UnmanagedType.SysUInt)] out Event e);
    

答案 1 :(得分:2)

在框架4之前,有些奇怪的是只包含一个IntPtr或int类型的字段的结构不能被编组为Struct。