2013-10-15 65 views
0

我目前的項目運行良好,所以像任何理智的人一樣,我試圖打破它的目的。一種可能是某些資源可能會丟失。當我忽略在運行文件夾中放入DLL時,我的應用程序崩潰壯觀。處理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 

然而,當我處理這個異常,程序仍繼續崩潰。 一旦退出初始化階段,就會加載form main,並且一直到該事件的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沒有發現異常?

+0

非常簡單的啓動應用程序與最小的依賴關係,以啓動前檢查環境的健全性?也可以顯示你的啓動畫面。 –

+0

...或者在您嘗試使用它們之前測試啓動時是否存在所需的文件。因爲您將會或者已經編寫安裝程序,您的應用程序可以知道在哪裏找到它們。 – Plutonix

+0

@Plutonix它正在啓動時檢查(初始化期間)。一個困難的問題是我已經將功能分成了大約17個類。我的初始化例程在Main的New()子部分被調用。該初始化在另一個類中調用「InitEthernetIO()」。這就是你看到我上面發佈的代碼的地方。它是包含違規資源的imports語句的類,而不是表單main。 –

回答

0

可以「優雅地」處理DLL未發現異常終止程序:

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是未處理」錯誤:

If Not MissingDll Then EthernetIO.Close() ' something like this