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

本文介绍了在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
就是这样了!这样就解决了这个问题!
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值