Vb.net 处理从dll内部引发的异常
我正在为学校做一个项目,其中加载了一个dll 加载的dll是我的程序和Twincat系统管理器之间的桥梁,Twincat系统管理器通过本地网络在计算机和PLC之间形成桥梁 我需要通过从plc到我的程序的整个链读取变量 我就是这样做的:Vb.net 处理从dll内部引发的异常,vb.net,visual-studio-2008,error-handling,ads,Vb.net,Visual Studio 2008,Error Handling,Ads,我正在为学校做一个项目,其中加载了一个dll 加载的dll是我的程序和Twincat系统管理器之间的桥梁,Twincat系统管理器通过本地网络在计算机和PLC之间形成桥梁 我需要通过从plc到我的程序的整个链读取变量 我就是这样做的: Public Function adsReadReal(ByVal Variabelenaam As String) As Single Dim ds = New TwinCAT.Ads.AdsStream(4 * 8) ' new data stream
Public Function adsReadReal(ByVal Variabelenaam As String) As Single
Dim ds = New TwinCAT.Ads.AdsStream(4 * 8) ' new data stream
Dim br = New System.IO.BinaryReader(ds) 'new binary
Dim hVar = New Integer
Try
ConState(1)
tcclient = New TcAdsClient
ConState(2)
tcclient.Connect(Form1.amsAdress, 801) 'connects the tcclient to the PLC
hVar = tcclient.CreateVariableHandle(Variabelenaam) 'creats a handle for the variable
tcclient.Read(hVar, ds) 'read it
ConState(5)
Return br.ReadSingle() 'convert it from binary to readable for vb
Catch ex As Exception
ConState(0)
PrintEx(ex) 'print out the exception
finally
tcclient.Dispose() 'make the object stop being used to prevent a lingering connection
End Try
Return False
End Function
现在,程序在连接模块的开头加载一个名为TwinCAT.ADS.dll的dll。如果Twincat系统管理器正在运行,程序将正常结束,但当程序未运行时,程序将崩溃并出现以下错误:
System.DllNotFoundException未处理
Message=Kan DLL tcadsdll.DLL niet-loaded:Kan opgegegeven模块niet-vinden。Uitzondering van HRESULT:0x8007007E
Source=TwinCAT.Ads
字体名=
堆栈跟踪:
bij TwinCAT.Ads.Internal.tcadsdlllwrapper.tcadsddll.AdsAmsUnRegisterRouterNotification
bij TwinCAT.Ads.Internal.tcadsdlllwrapper.AmsUnRegisterRouterNotificationBoolean
滴漏性感觉
bij TwinCAT.Ads.Internal.TcLocalSystem.DisposeBoolean disposing
bij TwinCAT.Ads.Internal.TcLocalSystem.Finalize
大致可以翻译为:
无法加载DLL tcadsdll.DLL:找不到给定模块。例外情况
HRESULT:0x8007007E
这不是我导入的dll,因此它必须来自TwinCAT.ADS.dll
我怎样才能防止程序向我抛出这个错误,而是和平地关闭程序?我已尝试捕获每个与dll相关的操作的所有异常
此外,源位于Bitbucket上。我会按要求公布的
Beckhoff官方网站上的一些链接:
编辑:
显然,使用tcclient.dispose会导致错误,因为使用finnaly语句而不是在try块之后
编辑:这当前捕获异常,但不处理它
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler
Dim tick As Byte = 0
Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
Dim ex As Exception = DirectCast(args.ExceptionObject, Exception)
MsgBox("exception tick" & Str(tick))
tick = tick + 1
PrintEx(ex)
End Sub
编辑:
未正确捕获异常,因为在vs2008中发生了两个错误,但在我按F5继续后会出现勾号
当程序直接运行时,我只看到1个记号。然后windows给出了一个错误。您是否尝试了未处理的异常处理程序
Dim currentDomain As AppDomain = AppDomain.CurrentDomain
AddHandler currentDomain.UnhandledException, AddressOf MyHandler
Sub MyHandler(sender As Object, args As UnhandledExceptionEventArgs)
Dim e As Exception = DirectCast(args.ExceptionObject, Exception)
Console.WriteLine("MyHandler caught : " + e.Message)
End Sub
只是一个旁注,在catch语句之后添加finally子句。这确保了即使程序异常关闭也会进行处理。在我看来,您缺少了所导入库的依赖项。@dwerner在Twincat按预期运行时不会出现。可以在运行时加载程序集。我不知道您如何阻止非您自己的代码尝试加载它。@dwerner是否可以看到运行的进程没有提升?如果是这样,我可以阻止程序启动任何需要dll的对象并将其全部关闭。此处无法识别AddHandler。Gives:语法错误。请确保您将其放置在正确的位置:您的错误必须来自您定义此处理程序的地方以外的其他地方,否则它将被处理。好的,经过一些修复后,我捕获异常。但是我怎么解决呢?显然你调用的DLL正在寻找另一个文件。因此,解决问题的唯一方法是联系DLL的开发人员。但如果我的回答有帮助,请接受: