ClickOnce application: test if program is being run off line

robertb_NZ

Well-known member
Joined
May 11, 2010
Messages
146
Location
Auckland, New Zealand
Programming Experience
10+
I have a ClickOnce application published with option "The application is available offline as well". When run from the web page it is passed a URI query, so I need to know if it is being run offline, or from Visual Studio. I have the following code, which works, but is there a better way that doesn't use Try/Catch, to avoid relying on error trapping for "normal logic".

If System.Diagnostics.Debugger.IsAttached Then ' Case 1: Debugging (run from Visual Studio)
' Set Debugging defaults​
Else
Try ' Case 2. Run from JazzSoftware web page.
QueryString = ApplicationDeployment.CurrentDeployment.ActivationUri.Query
HandleParameters() ' Parameter received with download
' Encrypt and save query string
Catch ex As Exception ' Case 3. Run downloaded copy offline
QueryString = Decrypt(saved query string)
HandleParameters()
End Try​
End If

Thank you, Robert.
 

jmcilhinney

VB.NET Forum Moderator
Staff member
Joined
Aug 17, 2004
Messages
14,402
Location
Sydney, Australia
Programming Experience
10+
What's the exception that gets thrown? I don't really use ClickOnce so I don't know the answer to your question off the top of my head but the nature of the exception may lead to an answer.
 

robertb_NZ

Well-known member
Joined
May 11, 2010
Messages
146
Location
Auckland, New Zealand
Programming Experience
10+
Thanks John, that was the right question. The answer: Unhandled exception, caused by "Object reference not set to an instance of an object".

Which got me thinking: the problem was clearly somewhere in the ApplicationDeployment.CurrentDeployment object. So I put in a diagnostic: -
If IsNothing(ApplicationDeployment.CurrentDeployment) Then
MsgBox("#1")​
ElseIf IsNothing(ApplicationDeployment.CurrentDeployment.ActivationUri) Then
MsgBox("#2")​
ElseIf IsNothing(ApplicationDeployment.CurrentDeployment.ActivationUri.Query) Then
MsgBox("#3")​
End If

The test => "#2".

So I was able to fix the problem like this: -
If System.Diagnostics.Debugger.IsAttached Then ' Case 1: Debugging (run from Visual Studio)
' Code for debugging​
ElseIf IsNothing(ApplicationDeployment.CurrentDeployment) OrElse IsNothing(ApplicationDeployment.CurrentDeployment.ActivationUri) _
OrElse IsNothing(ApplicationDeployment.CurrentDeployment.ActivationUri.Query) Then​
' Case 3. Run downloaded copy offline. This is the code that was previously in the Catch​
Else
' Case 2. Run from JazzSoftware web page.​
End If

I really only need the 2nd condition in
ElseIf IsNothing(...) OrElse IsNothing(...) OrElse IsNothing(...) Then​
However I thought that it would be safer to check each level of the hierarchy in case I don't understand enough about what's really going on.

Thank you, Robert.
 
Top Bottom