0

我目前的项目运行良好,所以像任何理智的人一样,我正试图故意破坏它。一种可能性是某些资源可能会丢失。当我忽略在运行文件夹中放置一个 dll 时,我的应用程序会严重崩溃。

是否可以“优雅地”处理因缺少资源而导致的异常?

我的一个类导入了一个引用“TcAdsDll.dll”的资源。.

....
Imports Okuma.EthernetIO
....

在该类中,我能够捕获尝试使用此资源时生成的异常:

    Try
        Dim objAdsStateInfo As TwinCAT.Ads.StateInfo = Nothing
        Try
             'Do a bunch of fun stuff with Ethernet...
        Catch...  
        'catch Ethernet errors              
        End Try
    Catch ex As Exception
    'This catches the exception generated when I try to instantiate an object that uses the dll which is no longer present
    End Try

但是,在我处理了这个异常之后,程序仍然会崩溃。一旦退出初始化阶段,表单 main 就会被加载,我会一直到该事件的 end sub。一旦我执行“End Sub”语句(逐行调试),我就会收到消息:

DllNotFoundException was unhandled
Unable to load 'tcadsdll.dll': The specified module could not be found.
(Exception from HRESULT: 0x8007007E)

在对使用它的资源做任何事情之前,我已经添加了代码来检查这个 .dll 是否存在,但是因为它通过导入语句链接到类中,它仍然会尝试处理它并崩溃。我是否必须重建资源 (Okuma.EthernetIO) 以包括检查 dll 文件?或者有没有一种优雅的方法可以在我的应用程序中轻松解决这个问题,而我只是不知道?

更新:在跳转到包含导入的类之前检查 dll 文件是否存在对我有用。它首先阻止了异常的产生。但是问题仍然存在:
有没有办法处理 dll not found 异常?

4

1 回答 1

0

您可以通过终止程序“优雅地”处理 DLL not found 异常:

Dim MissingDll as Boolean = False
Try
    'Do a bunch of fun stuff with Ethernet...
Catch ex As System.DllNotFoundException
    MissingDll = True
    MsgBox("Missing DLL", , "Fatal Error")
    Application.Exit()
End Try

在您的关闭代码中,使用 MissingDll 来避免调用也会导致“DllNotFoundException was unhandled”错误的其他函数:

If Not MissingDll Then EthernetIO.Close()  ' something like this
于 2015-11-30T17:07:45.670 回答