Visual Studio 2015 中的 VB.Net -“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”

Posted

技术标签:

【中文标题】Visual Studio 2015 中的 VB.Net -“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”【英文标题】:VB.Net in Visual Studio 2015 - "Attempted to read or write protected memory. This is often an indication that other memory is corrupt." 【发布时间】:2020-09-16 01:46:05 【问题描述】:

每个人。希望疫情期间一切安好。

我有一个维护计划,多年来我一直在成功使用以下功能,直到我们最近从 Windows 7 更改为 Windows 10。

除其他外,我的程序会显示扫描到 Xerox Docushare 中的 PDF 文档。这些文档与条形码中的参考 ID 相关联。一张封面(条形码)可能有一个或几十个扫描实例。

我有一个用户定义的控件 (ucDocushare_DocumentSetByRefID.vb),它有一个 ListView (lvwDocuments) 和一个 TabControl (tcDocumentScanInstances)。功能是 ListView 显示代表扫描集的封面。当用户单击 ListView 中的项目时,TabControl 会显示一个选项卡,其中包含与所选封面相关的每个单独的扫描实例。

时不时地,当我单击 ListView 中的封面项目时,程序会直接终止,没有明显的原因。在 Visual Studio 2015 中调试时,会显示以下消息。它与文档的大小或扫描实例的数量无关。我已经成功地提出了很多页的非常大的文档。我也有很多扫描实例成功出现。

System.AccessViolationException 未处理 消息:System.Windows.Forms.dll 中发生“System.AccessViolationException”类型的未处理异常

附加信息:试图读取或写入受保护的内存。这通常表明其他内存已损坏。

此外,会出现一个 Break Mode 选项卡,其中包含以下内容:

应用程序处于中断模式

您的应用已进入中断状态,但没有可显示的代码,因为所有线程都在执行外部代码(通常是系统或框架代码)。

从这个的 End Sub 行单步执行时会立即发生错误:

Private Sub tcDocumentScanInstances_DrawItem(sender As Object, e As DrawItemEventArgs) _
    Handles tcDocumentScanInstances.DrawItem

这个 DrawItem sub 对标签标签进行了一些字体管理,但主要确定在这些标签上显示哪个图标。

这是那个子的完整代码:

'Color code document tab labels and display appropriate icons.
 Private Sub tcDocumentScanInstances_DrawItem(sender As Object, e As DrawItemEventArgs) _
    Handles tcDocumentScanInstances.DrawItem

Try

    Dim intTabIndex As Integer = 0

    '  Identify which TabPage is currently selected
    Dim SelectedTab As TabPage = tcDocumentScanInstances.TabPages(e.Index)

    '  Get the area of the header of this TabPage.  This is the actual label for the tab page.
    Dim HeaderRect As Rectangle = tcDocumentScanInstances.GetTabRect(e.Index)

    '  Create a Brush to paint the Text
    Dim sbBlackBrush As New SolidBrush(Color.Black)
    Dim sbRedBrush As New SolidBrush(Color.Red)

    '  Set the Alignment of the Text
    Dim sf As New StringFormat()
    sf.Alignment = StringAlignment.Center
    sf.LineAlignment = StringAlignment.Center

    '  Paint the Text using the appropriate Bold setting 
    Dim intIconPositionX As Integer = HeaderRect.Left + 4
    Dim intIconPositionY As Integer = HeaderRect.Top + 7

    Dim dicImages As New Dictionary(Of String, Image)()
    dicImages("Tab" & e.Index) = Nothing  ' Set the value of the "variable"

    tcDocumentScanInstances.Padding = New System.Drawing.Point(15, 15)
    'tcDocumentScanInstances.TabPages(0).Width = 500

    If Convert.ToBoolean(e.State And DrawItemState.Selected) Then

        Dim BoldFont As New Font(tcDocumentScanInstances.Font.Name, tcDocumentScanInstances.Font.Size, FontStyle.Bold)

        e.Graphics.FillRectangle(New SolidBrush(SystemColors.ButtonFace), e.Bounds)

        If tcDocumentScanInstances.TabPages(e.Index).Tag Is Nothing Then
            tcDocumentScanInstances.TabPages(e.Index).Tag = ""
        End If

        Select Case tcDocumentScanInstances.TabPages(e.Index).Tag.ToString
            Case "Delete", "Delete Client Letter", "Excessive Documentation"
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.DeleteDocument)
                e.Graphics.DrawString(SelectedTab.Text, BoldFont, sbRedBrush, HeaderRect, sf)
                sbRedBrush.Dispose()
            Case "No Documentation"
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.NoDocumentExists)
                e.Graphics.DrawString(SelectedTab.Text, BoldFont, sbBlackBrush, HeaderRect, sf)
                sbBlackBrush.Dispose()
            Case Else
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.DocumentExists)
                e.Graphics.DrawString(SelectedTab.Text, BoldFont, sbBlackBrush, HeaderRect, sf)
                sbBlackBrush.Dispose()
        End Select

        e.Graphics.DrawImage(dicImages("Tab" & e.Index), intIconPositionX, intIconPositionY)

    Else

        e.Graphics.FillRectangle(New SolidBrush(Color.FromArgb(128, 167, 240)), e.Bounds)
        If tcDocumentScanInstances.TabPages(e.Index).Tag Is Nothing Then
            tcDocumentScanInstances.TabPages(e.Index).Tag = ""
        End If

        Select Case tcDocumentScanInstances.TabPages(e.Index).Tag.ToString
            Case "Delete", "Delete Client Letter", "Excessive Documentation"
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.DeleteDocument)
                e.Graphics.DrawString(SelectedTab.Text, e.Font, sbRedBrush, HeaderRect, sf)
                sbRedBrush.Dispose()
            Case "No Documentation", "Missing Documentation"
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.NoDocumentExists)
                e.Graphics.DrawString(SelectedTab.Text, e.Font, sbBlackBrush, HeaderRect, sf)
                sbBlackBrush.Dispose()
            Case Else
                dicImages("Tab" & e.Index) = ilTabIconsForDocumentScanInstances.Images(IconsForDocumentScanInstances.DocumentExists)
                e.Graphics.DrawString(SelectedTab.Text, e.Font, sbBlackBrush, HeaderRect, sf)
                sbBlackBrush.Dispose()
        End Select

        e.Graphics.DrawImage(dicImages("Tab" & e.Index), intIconPositionX, intIconPositionY)

    End If

    If tcDocumentScanInstances.SelectedTab.Tag Is Nothing Then
        tcDocumentScanInstances.SelectedTab.Tag = ""
    End If

    If frmCaseMaintenance.tcDocumentationByRefID.TabPages( _
        frmCaseMaintenance.tcDocumentationByRefID.SelectedIndex).Tag.ToString.Length >= "Delete".Length Then

        If frmCaseMaintenance.tcDocumentationByRefID.TabPages( _
            frmCaseMaintenance.tcDocumentationByRefID.SelectedIndex).Tag.ToString.Substring(0, "Delete".Length) <> "Delete" Then
            'The coversheet and all associated documents, together, are not marked for deletion.

            Select Case tcDocumentScanInstances.SelectedTab.Tag.ToString.Trim
                Case "Delete", "Delete Client Letter"
                    btnMarkCurrentDocumentForDeletion.Enabled = False
                    btnUnmarkCurrentDocumentForDeletion.Enabled = True
                Case "No Documentation", "Missing Documentation"
                    'A tab displaying a message that there is no documentation can not be deleted.
                    btnMarkCurrentDocumentForDeletion.Enabled = False
                    btnUnmarkCurrentDocumentForDeletion.Enabled = False
                Case Else
                    btnMarkCurrentDocumentForDeletion.Enabled = True
                    btnUnmarkCurrentDocumentForDeletion.Enabled = False
            End Select

        Else 'the coversheet and all associated documents, together, are marked for deletion.

            btnMarkCurrentDocumentForDeletion.Enabled = False
            btnUnmarkCurrentDocumentForDeletion.Enabled = False

        End If

    Else 'the coversheet and all associated documents, together, are marked for deletion.

            Select Case tcDocumentScanInstances.SelectedTab.Tag.ToString.Trim
                Case "Delete", "Delete Client Letter"
                    btnMarkCurrentDocumentForDeletion.Enabled = False
                    btnUnmarkCurrentDocumentForDeletion.Enabled = True
                Case "No Documentation", "Missing Documentation"
                    'A tab displaying a message that there is no documentation can not be deleted.
                    btnMarkCurrentDocumentForDeletion.Enabled = False
                    btnUnmarkCurrentDocumentForDeletion.Enabled = False
                Case Else
                    btnMarkCurrentDocumentForDeletion.Enabled = True
                    btnUnmarkCurrentDocumentForDeletion.Enabled = False
            End Select

    End If

Catch ex As Exception

    If Err.Description = "A generic error occurred in GDI+." Then
        'This error probably was tripped by this line:  e.Graphics.FillRectangle(New SolidBrush(SystemColors.ButtonFace), e.Bounds)
        'tabDocumentScanInstance_DrawItem() will execute again without that line causing a problem, so we do nothing here.
    Else
            MessageBox.Show( _
                 "Class Name:  " & Me.Name & vbCrLf & _
                 "Sub Name:  tcDocumentScanInstances_DrawItem()" & vbCrLf & _
                 "Error Number:  " & Err.Number & vbCrLf & _
                 "Message:  " & Err.Description, _
                 gstrExecutableName & " - Error", _
                 MessageBoxButtons.OK, MessageBoxIcon.Error)
    End If

End Try

End Sub

正在使用的产品

Microsoft Visual Studio 专业版 2015 版本 14.0.25431.01 更新 3

Microsoft .NET 框架 版本 4.8.03752

尝试的解决方案

重启电脑

删除可执行文件并生成一个新的

在命令提示符中执行“netsh winsock reset”并重新启动;还在命令提示符中执行了“netsh winsock reset catalog”并重新启动

将“平台目标”从“任何 CPU”更改为“x86”。

    [项目名称]属性->“编译”选项卡->“编译选项”->“目标CPU” 重建/构建项目。 (当“x86”未能纠正问题时,我将其改回“Any CPU”。)

建议在 Visual Studio 中取消选中以下选项。已经是了。

   Tools menu ->Options -> Debugging -> General -> Uncheck this option "Suppress JIT optimization on module load"

将位于此处的 System.Windows.Forms.dll 替换为该文件的另一个副本(相同的日期/时间和文件大小):C:\Windows\Microsoft.NET\Framework\v2.0.50727

感谢您的意见。

【问题讨论】:

【参考方案1】:

我通过蛮力解决方法成功了。我发现如果我从 ListView 中选择了有问题的项目,而 首先 从 ListView 中选择了任何其他 没有 导致问题的项目,就会出现问题。因此,解决方案是以某种方式选择一个不会导致问题的项目,然后再选择一个会导致问题的项目。我怎么知道我可以选择哪一个不会导致问题?另外,如果列表中只有一项,那我该怎么办?

解决方案是创建一个虚拟文档并始终先加载它。

和以前一样,用户选择一个填充 ListView (lvwDocuments) 的类别,它显示代表扫描集的封面。然而,现在,在将这些封面加载到列表中之前,会加载一个表示虚拟封面的项目。 (列表中的第一项是虚拟封面,其余项是所选类别的有效项。)基于该虚拟项作为列表中的第一项,我将虚拟文档加载到 tabControl (tcDocumentScanInstances) 中的选项卡上.我从ListView(LVWdocuments)中删除虚拟盖子项,并使用面板隐藏标签上的虚拟文档,该面板显示一条消息,告诉用户扫描实例在选中涵盖覆盖物项目时将显示在选项卡中。 (令人惊讶的是,它实际上看起来比我以前的界面更好,并且消息似乎没有必要或不合适!)由于加载和删除的速度如此之快,因此用户永远不会在列表中看到虚拟项目。

你有它。从我在寻找解决方案时发现的情况来看,似乎有很多不同的情况会发生此错误。我希望我知道一种更好的方法来防止这种情况,一种也可以应用于其他情况的方法。在这种情况下,此解决方案适用于我。我希望它能以某种方式帮助某人。

【讨论】:

好主意。很高兴你做到了。【参考方案2】:

我建议您以管理员身份打开您的项目:

右键单击VS2015->以管理员身份运行并打开您的项目。

调试您的代码。我认为您的问题不在于代码,而在于访问资源。它说here:

您可以在 Visual Studio IDE 中正常执行几乎所有操作 用户,但是,您需要管理员权限才能完成 以下任务:

工具箱 ||将经典 COM 控件添加到工具箱。 ||使用 工具箱

正如你所说的

'我有一个用户定义的控件(ucDocushare_DocumentSetByRefID.vb)'

【讨论】:

感谢您的建议。那对我来说是新的。但是,当我在 End Sub 处通过时,我得到了相同的结果。它大部分时间都有效,但我目前有两个无效。 “我目前有两个没有”是什么意思? 当我单击封面页的 ListView (lvwDocuments) 时会出现此问题,然后它应该在 TabControl (tcDocumentScanInstances) 中的选项卡上显示单个文档。并非总是如此,甚至通常不是,但有时,当我单击 lvwDocuments 时,程序会从可执行文件中终止或在 Visual Studio 中引发错误。我昨天发布了关于一组文件的信息。从那以后,我又成功地打开了另一套文件。我在第三组也遇到了问题。这些都是不相关的实例。 @M.W.试试这个答案:***.com/a/38793584/13393566 感谢您提出这个新建议。不幸的是,它并没有纠正问题。我按照指示设置了环境变量,确认了设置,并在 Visual Studio 中逐步执行了代码,结果相同。然后我重新启动计算机,确认设置,并在 Visual Studio 中再次尝试,还尝试直接运行可执行文件。结果是一样的。

以上是关于Visual Studio 2015 中的 VB.Net -“试图读取或写入受保护的内存。这通常表明其他内存已损坏。”的主要内容,如果未能解决你的问题,请参考以下文章

使用Visual Studio 2015 安装到Windows XP 构建的VB 应用程序

如何在 Windows 10 中从命令行构建 Visual Studio 2015 vb 解决方案

从 Visual Studio 2017 中的现有 VB.NET 项目创建 dll

Visual Studio 2015自定义安装不包括Visual Basic?

Visual Studio - VB - Windows 窗体项目 - 未声明“变量”。可能无法访问

2013 年 Visual Studio 中 VB.NET 的格式说明符