Sheldon1874 发表于 2015-6-26 06:16:38

为什么这个工具面板代码会导致致命错误

嗨,
当我运行下面的代码时,我得到一个致命的错误:未处理的访问冲突读取0x0000异常在7f37d9c9h。 任何想法为什么以及如何解决?
Imports Autodesk.AutoCAD.Runtime
Imports Autodesk.AutoCAD.ApplicationServices
Imports Autodesk.AutoCAD.EditorInput
Imports Autodesk.AutoCAD.Windows.ToolPalette
Imports System.Runtime
Public Class RPSPalette
    Friend Shared rpsToolps As Autodesk.AutoCAD.Windows.PaletteSet = Nothing
   _
    Public Sub rpsToolPalette()
      Try
            If rpsToolps Is Nothing Then
                Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
                Dim doc As Document = Application.DocumentManager.MdiActiveDocument
                Dim toolPaletteGroupName As String = "RPSToolGroup"
                Dim rpsToolps As New Autodesk.AutoCAD.Windows.PaletteSet(toolPaletteGroupName)
                Dim aboutPalette As usrControlAbout = New usrControlAbout()
                rpsToolps.Add("Abobut Palette", aboutPalette)
            End If
            rpsToolps.Visible = True
      Catch ex As Exception
            Autodesk.AutoCAD.ApplicationServices.Application.ShowAlertDialog("Error!" & vbLf & ex.Message)
      End Try
    End Sub
End Class

AutoCAD2014/Windows7
**** Hidden Message *****

Sheldon1874 发表于 2015-6-26 06:28:36

Doh,
            If rpsToolps Is Nothing Then
                Dim ed As Editor = Application.DocumentManager.MdiActiveDocument.Editor
                Dim doc As Document = Application.DocumentManager.MdiActiveDocument
                Dim toolPaletteGroupName As String = "RPSToolGroup"
                Dim rpsToolps As New Autodesk.AutoCAD.Windows.PaletteSet(toolPaletteGroupName)
                Dim aboutPalette As usrControlAbout = New usrControlAbout()
                rpsToolps.Add("Abobut Palette", aboutPalette)
                rpsToolps.Visible = True
            End If

是答案。

n.yuan 发表于 2015-6-26 09:29:09

我不认为你对第一篇文章的回答是正确的,至少在syntex方面。
此问题可能是因为使用VB.NET时没有设置“Option Strict”标志:您在类级别“rpsToolps”声明了一个“Shared”变量为Nothing,然后在If...然后...您声明了另一个局部变量,也命名为“rptToolps”(如果您使用C#,这是不允许的,然后您会立即注意到您的错误),这就是为什么您自己的答案是移动“rpsToolps”。Visible=True "...然后...声明,它似乎工作。您的“解决方案”的净效果是,您永远不会有指向PaletteSet实例的共享类级引用,并且每次运行您的命令时,都会创建PaletteSet的一个新实例。由于当用户单击“x”关闭PaletteSet时,实际上并不处理它,而只是将其设置为不可见,多次运行您的命令将创建PaletteSet的许多实例,所有以前打开的PaletteSet都作为不可见的无用垃圾驻留在内存中,因此您在AutoCAD进程中创建了“内存泄漏”的情况。
正确的方法是更改(在If...然后...结束If)
将rpsToolps作为新的Autodesk。AutoCAD . windows . paletteset(toolPaletteGroupName)
to
rpsToolps = New Autodesk。AutoCAD . windows . paletteset(toolpalettegroup name)
并离开
rpsToolps。Visible = True
在If外部...然后...就像你最初做的那样。

Sheldon1874 发表于 2015-6-26 11:55:35

感谢您指出我的方法错误。我实际上只是想知道为什么我仍然可以多次出现调色板。现在启用了选项严格。
我实际上正在将相当多的量从VBA转换为. net。作为AutoCAD中的兼职“黑客”和全职土地测量员,您认为尝试使用C#是否明智?
再次感谢,像往常一样,我学到了一些很好的东西。
页: [1]
查看完整版本: 为什么这个工具面板代码会导致致命错误