2012-05-17 5 views
1

dll이로드 된 학교 프로젝트에서 작업하고 있습니다.dll에서 throw 된 예외 처리

로드 된 dll은 내 프로그램과 로컬 네트워크를 통해 컴퓨터와 PLC 사이의 브리지를 형성하는 Twincat System Manager 사이의 다리 역할을합니다.

변수 풀을 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을로드 :

내가이 작업을 수행하는 방법입니다. 트윈 캣 시스템 관리자가 프로그램을 실행하는 경우 일반적으로 종료하지만, 그렇지 않은 경우는 충돌과 나에게이 오류 제공 :

System.DllNotFoundException was unhandled
Message="Kan DLL tcadsdll.dll niet laden: Kan opgegeven module niet vinden. (Uitzondering van HRESULT: 0x8007007E)"
Source="TwinCAT.Ads"
TypeName=""
StackTrace:
bij TwinCAT.Ads.Internal.TcAdsDllWrapper.TcAdsDll.AdsAmsUnRegisterRouterNotification()
bij TwinCAT.Ads.Internal.TcAdsDllWrapper.AmsUnRegisterRouterNotification(Boolean throwAdsException)
bij TwinCAT.Ads.Internal.TcLocalSystem.Dispose(Boolean disposing)
bij TwinCAT.Ads.Internal.TcLocalSystem.Finalize()

약 변환됩니다 :

Cannot load DLL tcadsdll.dll: Cannot find given module. (Exception at HRESULT: 0x8007007E)

이 dll을하지 않습니다 수입 한 제품이므로 반드시 있어야합니다. TwinCAT.ADS.dll

프로그램에서이 오류가 발생하지 않고 프로그램을 정상적으로 종료하지 못하게하려면 어떻게해야합니까? 가능한 모든 dll 관련 작업의 모든 예외를 잡으려고했습니다.

또한 출처는 Bitbucket입니다. 내가 요청하면 그것을 공개 할 것이다. 공식하지만 매우 손재주는 Beckhoff 사이트

일부 링크 :

http://infosys.beckhoff.com/espanol.php?content=../content/1034/tcquickstart/html/tcquickstart_samplevisualbasicnet.htm&id=10449

편집 : 분명히 finnaly 문이 대신 상대 후 사용이 때부터 tcclient.dispose()가 오류가 발생하여 블록을 시도하십시오

편집 : 이것은 현재 예외를 포착하지만 처리하지 못합니다.

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를 누른 후 (계속) 나타나지만 발생하기 때문에 예외가 제대로 잡힌되지 , I 똑딱 1 개만 볼 수 있습니다. 그런 다음 창에 오류가 발생합니다.

+0

그냥 'catch'문 다음에 finally 절을 추가하십시오. 따라서 프로그램이 비정상적으로 종료 되더라도 처리가 수행됩니다. – JonH

+0

당신이 가져온 라이브러리의 의존성이 누락 된 것처럼 보입니다. – dwerner

+0

@dwerner Twincat이 정상적으로 동작 할 때 발생하지 않습니다. –

답변

0

처리되지 않은 예외 처리기를 시도 했습니까?

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 
+0

AddHandler가 여기에서 인식되지 않습니다. 제공 : "구문 오류." –

+0

올바른 장소에 설치했는지 확인하십시오. http://msdn.microsoft.com/en-us/library/system.appdomain.unhandledexception.aspx –

+0

오류를 정의한 위치가 아닌 다른 곳에서 오류가 발생해야합니다 처리하지 않으면 처리됩니다. –

관련 문제