Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 处理从dll内部引发的异常_Vb.net_Visual Studio 2008_Error Handling_Ads - Fatal编程技术网

Vb.net 处理从dll内部引发的异常

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

我正在为学校做一个项目,其中加载了一个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
    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的开发人员。但如果我的回答有帮助,请接受: