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 Form1
  Private 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 的联合就是将这个描述字应用在结构上实现的。

Improts System.Runtime.InteropServices
<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吗?

vb.net如何调用dll(动态链接库)

如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅仅是 DLL 文件)

VB.net编写的dll,供vb6调用时dll中的函数不可见?

VB.net调用VC.net写的DLL出现“当前不会命中断点,还没有为该文档加载任何符号”!!急!急急!!!

VB.net 捕获 Ctrl+C