What I did, I used the packaging API and created a user-defined file extension that maps to the shell user interface. All he does is unzip the package into the ProgramData \ MyApp \ Extensions folder. Then, when the application restarts, a part appears.
See this blog for more details.
' Open the Package. ' ('using' statement insures that 'package' is ' closed and disposed when it goes out of scope.) Using package As Package = package.Open(fileName, FileMode.Open, FileAccess.Read) tFolder = IO.Path.Combine(tFolder, MediaToolz.SharedServices.FileSystem.GetSafeFileName(package.PackageProperties.Title)) Dim directoryInfo As New DirectoryInfo(tFolder) If directoryInfo.Exists Then directoryInfo.Delete(True) End If directoryInfo.Create() For Each part In package.GetParts() If part.ContentType = Packages.MediaToolzAddinMimeType Then ExtractPart(part, tFolder) End If Next package.Close() End Using ' --------------------------- ExtractPart --------------------------- ''' <summary> ''' Extracts a specified package part to a target folder.</summary> ''' <param name="packagePart"> ''' The package part to extract.</param> ''' <param name="targetDirectory"> ''' The relative path from the 'current' directory ''' to the targer folder.</param> Private Shared Sub ExtractPart(ByVal packagePart As PackagePart, ByVal targetDirectory As String) ' Create a string with the full path to the target directory. Dim pathToTarget As String = targetDirectory If pathToTarget.EndsWith(IO.Path.DirectorySeparatorChar) = False Then pathToTarget += IO.Path.DirectorySeparatorChar ' Remove leading slash from the Part Uri, ' and make a new Uri from the result Dim stringPart As String = packagePart.Uri.ToString().TrimStart("/"c) ' I added this line to take off the content pat stringPart = IO.Path.GetFileName(stringPart) Dim partUri As New Uri(stringPart, UriKind.Relative) ' Create a full Uri to the Part based on the Package Uri Dim uriFullPartPath As New Uri(New Uri(pathToTarget, UriKind.Absolute), partUri) ' Create the necessary Directories based on the Full Part Path 'Directory.CreateDirectory(Path.GetDirectoryName(uriFullPartPath.LocalPath)) ' Create the file with the Part content Using fileStream As New FileStream(uriFullPartPath.LocalPath, FileMode.Create) CopyStream(packagePart.GetStream(), fileStream) End Using 'Close & dispose fileStream. End Sub '
source share