VB.net调用DLL,捕捉到AccessVioationException尝试读取或写入受保护的内存。这通常指示其他内存已损坏。
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VB.net调用DLL,捕捉到AccessVioationException尝试读取或写入受保护的内存。这通常指示其他内存已损坏。相关的知识,希望对你有一定的参考价值。
vb6中能正常调用,现在要使用VB.net调用。调用函数里面有自定义的结构体作为参数,vb6和VB.net的结构体不一样。VB6中是这样定义的,
调试的时候计算了下数据长度是正常的,有1528个字节,应该是分配了相应的内存空间的。然后我在VB.net是这样定义的
应该在vb.net的结构体定义中不能指定数组个数。所以只有用下面那个函数进行重定义。
问题是我定义一个新的变量如
Dim X as new dc_msg
x.Initialize()
,发现X的数据长度只有16。没有分配相应的内存空间吗?
怎么解决——"尝试读取或写入受保护的内存。这通常指示其他内存已损坏。"v 这个问题呢??
跪求答案!!!!!
我觉得应该是结构体的问题,结构体的生成没有严格按照我定义的顺序,而是按首字母顺序,在内存空间中也是这样存储的?怎么严格按照我定义的顺序存储啊???
不要用 Initialize,直接用 New 构造函数。
Public Sub New()MyByte = New Byte(Size) 'Size就是数组的大小
End Sub追问
我已经试过这个方法了,还是一样的错误啊~
追答没有问题。
Public Class Form1Private Sub btn1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1.Click
Dim X As New TestA(1)
X.MyByte(17) = 212
MsgBox(CStr(X.Index) & ", " & CStr(X.MyByte(17)))
End Sub
End Class
Public Structure TestA
Public Index As Long
Public MyByte As Byte()
Public MyStr As String
Sub New(ByVal Idx As Long)
Index = Idx
MyStr = "Hello world."
MyByte = New Byte(20)
End Sub
End Structure
已经测试运行通过。
我是调用一个DLL ,这个返回值会存在这个结构体中。现在一运行DLL 的一个函数取返回值,就出现上述错误。VB.net 和VB 关于结构体在内存中的存储形成一样吗?所占空间严格按照定义来吗? 谢谢!!!
追答明白了,你需要的是 FieldOffset 描述字。
请参考MSDN的相关说明:
http://msdn.microsoft.com/zh-cn/library/system.runtime.interopservices.fieldoffsetattribute%28v=vs.80%29.aspx
MSDN的例子用的是一个 Class,但应用在结构和联合上是类似的。
事实上,VB.net 的联合就是将这个描述字应用在结构上实现的。
<StructLayout(LayoutKind.Explicit)> _
Structure MyUnion
<FieldOffset(0)> Dim b1 As Byte
<FieldOffset(1)> Dim b2 As Byte
<FieldOffset(2)> Dim b3 As Byte
<FieldOffset(3)> Dim b4 As Byte
<FieldOffset(0)> Dim i As Integer
<FieldOffset(0)> Dim ui As UInteger
End Structure
上面是一个四字节的联合,应该能看明白吧。
参考技术A VB.net不懂,看来我也得学学啦以上是关于VB.net调用DLL,捕捉到AccessVioationException尝试读取或写入受保护的内存。这通常指示其他内存已损坏。的主要内容,如果未能解决你的问题,请参考以下文章
vb.net把dll放到程序的Resources资源里面,能直接调用Resources里面的dll吗?
如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅仅是 DLL 文件)
VB.net编写的dll,供vb6调用时dll中的函数不可见?