当前位置:编程学习 > C#/ASP.NET >>

vb.net调用三方dll api出现PInvoke问题,请教各位大师....

使用vb.net调用一个三方dll,原三方dll的demo是用vb6写的,里面定义了一个type:
Public Type SERVICE_Package
    a(10) As Byte
    b(12) As Byte
    c(3) As Byte
    d As Byte
    e(200) As Byte
    f As Byte
    g(200) As Byte
End Type
我在vb.net中写了一个Structure,和VB6中的type一致:
Public Structure Service_Package
    Dim a() As Byte
    Dim b() As Byte
    Dim c() As Byte
    Dim d As Byte
    Dim e() As Byte
    Dim f As Byte
    Dim g() As Byte
    Public Sub Initialize()
      Redim a(10)
      Redim b(12)
      Redim c(3)
      Redim e(200)
      Redim g(200)
End Structure
引入DLL的命令:
Public Declare Function RecvPackage Lib "WPDAPI.dll" _
() As Service_Package

测试的时候,一直报错“方法的类型签名与 PInvoke 不兼容”,在网上查了些资料,也看了部分P/INVOKE资料,估计是P/Invoke返回的是指针所致,不过实在是没找到解决办法,求教各位大虾,是否有好的解决办法??




--------------------编程问答--------------------     Public Sub Initialize() 
      Redim a(10) 
      Redim b(12) 
      Redim c(3) 
      Redim e(200) 
      Redim g(200) 
去掉 --------------------编程问答-------------------- 去掉了,还是同样的报错~ --------------------编程问答-------------------- 给结构体加上:
<StructLayout(LayoutKind.Sequential)>    --------------------编程问答-------------------- 感谢caozhy的帮助,问题还是没有解决。
测试时还是提示“方法的类型签名与 PInvoke 不兼容”,晕了,折腾了两天了~ --------------------编程问答-------------------- Dim a() As Byte 修改为 Public a() As Byte
依次类推。 --------------------编程问答-------------------- 还有 Public Declare Function RecvPackage Lib "WPDAPI.dll" _ 
() As Service_Package 改成
Public Declare Function RecvPackage Lib "WPDAPI.dll" _ 
() As Long
看看返回什么。

实在不行,还有2个办法:
(1)使用.NET自动升级VB6程序。
(2)将VB6程序包装成ActiveX DLL,在.NET里面引用。 --------------------编程问答-------------------- 修改为As Long后,运行提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”,完全要昏倒了~ 还请高手赐教! --------------------编程问答-------------------- 刚才测试了一下,准备用IntPtr取返回的结构,然后用Marshal.PtrtoStructure将IntPtr转换至结构,结果还是提示“尝试读取或写入受保护的内存。这通常指示其他内存已损坏。”。。。。 --------------------编程问答-------------------- 自己顶....
补充:.NET技术 ,  VB.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,