vb.net语言调用dll函数出现“读取或写入受保护内存这通常指示其他内存已损坏”

这个问题我也纠结了很久,最终还是给我ko了!哈哈……

解决方法

调用外面dll函数的时候,首先要在模块里面通过declear来声明函数的,另外还有结构体也需要声明。注意,每个数据的类型要跟dll说明文档里面的一致才行,切不可疏忽!结构体里面有数组的时候,在vb6.0下面是可以直接赋值大小的,但是在.net下面是不允许这样做的。要在结构体(其实是不能继承的类而已)里面声明构造函数,在外面用new构建实例对象便可自动调用构造函数,在构造函数里面初始化数组大小就可以了!要不然编译会报错!在dll结构里面的数组前面加上一个语句限制其大小才行,不然执行的时候会发生错误

例如下面:

    Public Structure VCI_CAN_OBJ
         Dim ID As UInt32
         Dim TimeStamp As UInt32
         Dim TimeFlag As Byte
         Dim SendType As Byte
         Dim RemoteFlag As Byte
         Dim ExternFlag As Byte
         Dim DataLen As Byte
         <MarshalAs(UnmanagedType.ByValArray,SizeConst:=8)> _
         Dim data() As Byte
         <MarshalAs(UnmanagedType.ByValArray,SizeConst:=2)> _
         Dim Reserved() As Byte
 
         Public Sub New(ByVal a As Int16,ByVal b As Int16)
             ReDim data(a)
             ReDim Reserved(b)
         End Sub
     End Structure
就是这样了!这样就解决了这个问题!

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...