0
如果我的VB.NET程序所需的某些DLL丟失,當我運行它時,它崩潰與典型的Windows錯誤消息,並沒有提供任何關於錯誤的信息。防止應用程序崩潰而不提供信息,當DLL丟失
所以,我想在做任何事情之前驗證所有的依賴關係是滿足的。但這不是微不足道的,因爲我有非託管和運行時依賴關係。因此,在深入研究之前,是否有一些CLR設置,或針對此問題的一些更簡單的解決方案?
如果我的VB.NET程序所需的某些DLL丟失,當我運行它時,它崩潰與典型的Windows錯誤消息,並沒有提供任何關於錯誤的信息。防止應用程序崩潰而不提供信息,當DLL丟失
所以,我想在做任何事情之前驗證所有的依賴關係是滿足的。但這不是微不足道的,因爲我有非託管和運行時依賴關係。因此,在深入研究之前,是否有一些CLR設置,或針對此問題的一些更簡單的解決方案?
這真的很簡單(避免Windows的樣板消息,就是這樣)。你只需要讓你的應用程序處理UnhandledException事件。
對於一個VB.NET應用程序窗口像我的窗體,這意味着去項目屬性,Application
選項卡並單擊View Application events
按鈕。
打開了(隱藏默認情況下)ApplicationEvents.vb文件。我添加了一些代碼:
Namespace My
' The following events are available for MyApplication:
'
' Startup: Raised when the application starts, before the startup form is created.
' Shutdown: Raised after all application forms are closed. This event is not raised if the application terminates abnormally.
' UnhandledException: Raised if the application encounters an unhandled exception.
' StartupNextInstance: Raised when launching a single-instance application and the application is already active.
' NetworkAvailabilityChanged: Raised when the network connection is connected or disconnected.
Partial Friend Class MyApplication
Private Sub MyApplication_UnhandledException(ByVal sender As Object, _
ByVal e As Microsoft.VisualBasic.ApplicationServices.UnhandledExceptionEventArgs _
) Handles Me.UnhandledException
MessageBox.Show("Application crashed due to the following unhandled exception. " + e.Exception.ToString())
End Sub
End Class
End Namespace
現在,如果我錯過了一些DLL,我得到它的名字,如果它的管理或混合,在異常消息。如果缺少的DLL不受管理,我只能得到需要它的混合程序集的名稱。但是這對我來說很好,將混合程序集放在Depends.exe上很快就會顯示違規的非託管程序集。
如果你不知道你有什麼運行時依賴關係,那麼你總是可以從SysInternals的ProcMon實用程序中找到它。你會看到你的程序搜索DLL。 –
是的。但是我也有用/ clr開關構建的C++/CLI程序集,它引用了非託管C++程序集。不知道該怎麼做。我的意思是,我知道哪個程序集引用了哪個,這個東西正在以通用方式驗證它們的存在,而沒有對整個依賴樹進行硬編碼。 –
對,這就是ProcMon會告訴你的。在不到2分鐘的時間內做到這一點是不可能的,你必須嘗試。沒人能猜到你會看到什麼。如果您想要更好的建議,請向您使用的DLL的所有者尋求幫助。他們總是有可用的部署說明。 –