Introduction
The original tip/trick was published using C#, so I decided to add a Visual Basic version.
Sometimes it's good to know basic information concerning a ClickOnce deployment such as publish version, where the application was installed from, name of the manifest and so on.
This tip helps to resolve this information. It's usable only for applications that have ApplicationIdentity
set (such as ClickOnce deployed applications).
The code
First, the full code:
Public Class PublishInfo
Public Enum IdentityType
Deployment = 1
Application = 2
End Enum
Private Shared _versionRegex As New System.Text.RegularExpressions.Regex("Version=(?<Major>\d*).(?<Minor>\d*).(?<Build>\d*).(?<Revision>\d*)", System.Text.RegularExpressions.RegexOptions.Compiled)
Private Shared _cultureRegex As New System.Text.RegularExpressions.Regex(", Culture=(?<Culture>[^,]*),", System.Text.RegularExpressions.RegexOptions.Compiled)
Private Shared _publicKeyTokenRegex As New System.Text.RegularExpressions.Regex(", PublicKeyToken=(?<PublicKeyToken>[^,]*),", System.Text.RegularExpressions.RegexOptions.Compiled)
Private Shared _processorArchitectureRegex As New System.Text.RegularExpressions.Regex(", processorArchitecture=(?<ProcessorArchitecture>[^,]*)", System.Text.RegularExpressions.RegexOptions.Compiled)
Private Shared _uri As System.Uri
Public Shared Property Uri As System.Uri
Get
Return _uri
End Get
Private Set(value As System.Uri)
_uri = value
End Set
End Property
Private Shared _deploymentIdentity As Identity
Public Shared Property DeploymentIdentity As Identity
Get
Return _deploymentIdentity
End Get
Private Set(value As Identity)
_deploymentIdentity = value
End Set
End Property
Private Shared _applicationIdentity As Identity
Public Shared Property ApplicationIdentity As Identity
Get
Return _applicationIdentity
End Get
Private Set(value As Identity)
_applicationIdentity = value
End Set
End Property
Shared Sub New()
Dim identities As String
Dim identity(2) As String
Try
identities = System.AppDomain.CurrentDomain.ApplicationIdentity.FullName
PublishInfo.Uri = New System.Uri(identities.Substring(0, identities.IndexOf("#")))
identities = identities.Substring(identities.IndexOf("#") + 1)
If (identities.IndexOf("\") > -1) Then
identity = identities.Split("\")
Else
identity = identities.Split("/")
End If
PublishInfo.DeploymentIdentity = New Identity(identity(0), IdentityType.Deployment)
PublishInfo.ApplicationIdentity = New Identity(identity(1), IdentityType.Application)
Catch
End Try
End Sub
Public Class Identity
Private _identityType As PublishInfo.IdentityType
Public Property IdentityType As PublishInfo.IdentityType
Get
Return Me._identityType
End Get
Private Set(value As PublishInfo.IdentityType)
Me._identityType = value
End Set
End Property
Private _version As System.Version
Public Property Version As System.Version
Get
Return Me._version
End Get
Private Set(value As System.Version)
Me._version = value
End Set
End Property
Private _applicationName As String
Public Property ApplicationName As String
Get
Return Me._applicationName
End Get
Private Set(value As String)
Me._applicationName = value
End Set
End Property
Private _publicKeyToken As String
Public Property PublicKeyToken As String
Get
Return Me._publicKeyToken
End Get
Private Set(value As String)
Me._publicKeyToken = value
End Set
End Property
Private _processorArchitecture As System.Reflection.ProcessorArchitecture
Public Property ProcessorArchitecture As System.Reflection.ProcessorArchitecture
Get
Return Me._processorArchitecture
End Get
Private Set(value As System.Reflection.ProcessorArchitecture)
Me._processorArchitecture = value
End Set
End Property
Private Sub New()
End Sub
Friend Sub New(identity As String, identityType As PublishInfo.IdentityType)
Dim regexMatch As System.Text.RegularExpressions.Match
Dim architecture As System.Reflection.ProcessorArchitecture
Me.IdentityType = identityType
Try
Me.ApplicationName = identity.Substring(0, identity.IndexOf(","))
regexMatch = _versionRegex.Match(identity)
Me.Version = New System.Version(Int16.Parse(regexMatch.Groups("Major").ToString()),
Int16.Parse(regexMatch.Groups("Minor").ToString()),
Int16.Parse(regexMatch.Groups("Build").ToString()),
Int16.Parse(regexMatch.Groups("Revision").ToString()))
regexMatch = _publicKeyTokenRegex.Match(identity)
Me.PublicKeyToken = regexMatch.Groups("PublicKeyToken").ToString()
regexMatch = _processorArchitectureRegex.Match(identity)
If (Not System.Enum.TryParse(Of System.Reflection.ProcessorArchitecture)(regexMatch.Groups("ProcessorArchitecture").ToString(), True, architecture)) Then
architecture = System.Reflection.ProcessorArchitecture.None
End If
Me.ProcessorArchitecture = architecture
Catch
End Try
End Sub
End Class
End Class
Main parts explained
The ApplicationIdentity
of CurrentDomain
returns a string representation for the application. This string contains three informative parts:
- Application URL
#
as a separator- Deployment identity
- \ as a separator (1)
- Application identity
The PublishInfo
constructor first separates the application URL and stores it statically in this class. After this the remainder of the string is splitted using the separator.
1 Even though the MSDN documentation states that \
is used as a separator, when I tested this /
was the actual separator used. For this reason both variations are implemented in the code.
The Identity
class holds the information for individual identity, application or deployment. In the constructor of this class the key information is parsed from the identity string and placed on proper properties such as Version
.
The properties of the Identity class are:
IdentityType
: Which type of identity is this: Application or DeploymentApplicationName
: either the application name or the deployment manifest name depending on the identity typeVersion
: Version for the identity described using System.Version classPublicKeyToken
: Public key token of the identityProcessorArchitecture
: Processor architecture of the identity, described using System.Reflection.ProcessorArchitecture enumeration
Using the class
As an example of the usage of the class I wrote the property values of both identities to output window of Visual Studio using Debug
class:
System.Diagnostics.Debug.WriteLine("Uri: " + PublishInfo.Uri.ToString())
System.Diagnostics.Debug.WriteLine("")
System.Diagnostics.Debug.WriteLine("DeploymentIdentity")
System.Diagnostics.Debug.WriteLine("------------------")
System.Diagnostics.Debug.WriteLine("ApplicationName: " + PublishInfo.DeploymentIdentity.ApplicationName)
System.Diagnostics.Debug.WriteLine("Version: " + PublishInfo.DeploymentIdentity.Version.ToString())
System.Diagnostics.Debug.WriteLine("PublicKeyToken: " + PublishInfo.DeploymentIdentity.PublicKeyToken)
System.Diagnostics.Debug.WriteLine("ProcessorArchitecture: " + PublishInfo.DeploymentIdentity.ProcessorArchitecture.ToString())
System.Diagnostics.Debug.WriteLine("")
System.Diagnostics.Debug.WriteLine("ApplicationIdentity")
System.Diagnostics.Debug.WriteLine("-------------------")
System.Diagnostics.Debug.WriteLine("ApplicationName: " + PublishInfo.ApplicationIdentity.ApplicationName)
System.Diagnostics.Debug.WriteLine("Version: " + PublishInfo.ApplicationIdentity.Version.ToString())
System.Diagnostics.Debug.WriteLine("PublicKeyToken: " + PublishInfo.ApplicationIdentity.PublicKeyToken)
System.Diagnostics.Debug.WriteLine("ProcessorArchitecture: " + PublishInfo.ApplicationIdentity.ProcessorArchitecture.ToString())
The results were like
Uri: file:///C:/.../publish/IdentityVB.application
DeploymentIdentity
------------------
ApplicationName: DomainIdentityVB.application
Version: 1.0.0.2
PublicKeyToken: 78d3234f402381cd
ProcessorArchitecture: X86
ApplicationIdentity
-------------------
ApplicationName: DomainIdentityVB.exe
Version: 1.0.0.2
PublicKeyToken: 78d3234f402381cd
ProcessorArchitecture: X86
Note that if you're running the program from Visual Studio, you'll get different results, such as
Uri: http://tempuri.org/IdentityVB.application
DeploymentIdentity
------------------
ApplicationName: DomainIdentityVB.application
Version: 1.0.0.2
PublicKeyToken: 0000000000000000
ProcessorArchitecture: X86
ApplicationIdentity
-------------------
ApplicationName: DomainIdentityVB.exe
Version: 1.0.0.2
PublicKeyToken: 0000000000000000
ProcessorArchitecture: X86
Also note that if the application hasn't been deployed yet, ApplicationIdentity
is nothing so both identities in the shared helper class are null.
History
- April 1, 2012: Alternative created.