Click here to Skip to main content
11,706,979 members (52,373 online)
Click here to Skip to main content

Shadow Copying of Applications

, 16 Oct 2008 CPOL 63.7K 915 127
Rate this:
Please Sign up or sign in to vote.
Shadow copied applications aren't locked by the loader, so they can be updated/substituted at runtime.

Introduction

Running an application shadow copied can be useful for purposes like auto-updating. On normal execution, the assembly gets locked by the loader and can't be substituted while it's executed. On shadow copying, all assemblies referenced are copied to a cache path, and loaded/executed from this location - so the assemblies aren't locked, and can be changed.

Background

This technique is well known in ASP.NET, but on the application side, there's little information (even on MSDN). Therefore, I'd like to share my findings.

Using the Code

For executing an assembly from the cache path, we have to use a loader/bootstrapper. This little program creates a domain from which the application gets loaded. That means, when we want to start the application, we have to start the loader that loads the application for us.

The code for the application and all the referenced assemblies need no change.

The code for the loader is:

using System;
using System.IO;

namespace Loader
{
    static class Program
    {
        [LoaderOptimization(LoaderOptimization.MultiDomainHost)]
        [STAThread]
        static void Main()
        {
            /* Enable shadow copying */

            // Get the startup path. Both assemblies (Loader and
            // MyApplication) reside in the same directory:
            string startupPath = Path.GetDirectoryName(
				System.Reflection.Assembly
				.GetExecutingAssembly().Location);

            // cache path = directory where the assemblies get
            // (shadow) copied:
            string cachePath = Path.Combine(
                startupPath,
                "__cache");
            string configFile = Path.Combine(
                startupPath,
                "MyApplication.exe.config");
            string assembly = Path.Combine(
                startupPath,
                "MyApplication.exe");

            // Create the setup for the new domain:
            AppDomainSetup setup = new AppDomainSetup();
            setup.ApplicationName = "MyApplication";
            setup.ShadowCopyFiles = "true"; // note: it isn't a bool
            setup.CachePath = cachePath;
            setup.ConfigurationFile = configFile;

            // Create the application domain. The evidence of this
            // running assembly is used for the new domain:
            AppDomain domain = AppDomain.CreateDomain(
                "MyApplication",
                AppDomain.CurrentDomain.Evidence,
                setup);

            // Start MyApplication by executing the assembly:
            domain.ExecuteAssembly(assembly);

            // After the MyApplication has finished clean up:
            AppDomain.Unload(domain);
            Directory.Delete(cachePath, true);
        }
    }
}

Points of Interest

This simple program gives us the possibility to easily create auto updates (that replace the application's assembly).

History

  • 07 October 2008 - Initial release
  • 14 October 2008 - Article updated

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

Share

About the Author

Günther M. FOIDL
Software Developer (Senior) Foidl Günther
Austria Austria
Engineer in combustion engine development.
Programming languages: C#, FORTRAN 95, Matlab

FIS-overall worldcup winner in Speedski (Downhill) 2008/09 and 2009/10.

You may also be interested in...

Comments and Discussions

 
Questionwould application take the quick reference of new change after shadow copy ? Pin
RameshJangir27-Nov-14 2:25
memberRameshJangir27-Nov-14 2:25 
GeneralMy vote of 5 Pin
Simon Raffl20-May-13 7:22
memberSimon Raffl20-May-13 7:22 
GeneralMy vote of 5 Pin
Rahul Rajat Singh26-Nov-12 20:13
memberRahul Rajat Singh26-Nov-12 20:13 
QuestionRequires Admin Permissions Pin
Jeff Bowman18-Jun-12 13:29
memberJeff Bowman18-Jun-12 13:29 
GeneralMy vote of 5 Pin
manoj kumar choubey26-Feb-12 21:33
membermanoj kumar choubey26-Feb-12 21:33 
QuestionUser priviliges? Pin
TobiasP15-Oct-08 3:08
memberTobiasP15-Oct-08 3:08 
AnswerRe: User priviliges? Pin
Günther M. FOIDL15-Oct-08 3:48
memberGünther M. FOIDL15-Oct-08 3:48 
GeneralRe: User priviliges? Pin
Ed.Poore16-Oct-08 11:44
memberEd.Poore16-Oct-08 11:44 
GeneralRe: User priviliges? Pin
Günther M. FOIDL16-Oct-08 12:07
memberGünther M. FOIDL16-Oct-08 12:07 
GeneralRe: User priviliges? Pin
Ed.Poore16-Oct-08 12:14
memberEd.Poore16-Oct-08 12:14 
GeneralEnvironment.CurrentDirectory is wrong... Pin
Danilo Corallo10-Oct-08 2:01
memberDanilo Corallo10-Oct-08 2:01 
GeneralRe: Environment.CurrentDirectory is wrong... Pin
Günther M. FOIDL10-Oct-08 2:24
memberGünther M. FOIDL10-Oct-08 2:24 
GeneralRe: Environment.CurrentDirectory is wrong... Pin
Danilo Corallo10-Oct-08 2:33
memberDanilo Corallo10-Oct-08 2:33 
If it's starting from a link the Environment.CurrentDirectory can be different. You also say that the SaveFileDialog can change it. If works 99% of the times, it's still wrong 1% of the times.
On the other hand, reflection works 100% of the times.
I didn't meant to be rude, just to suggest a small improvement to a nice snippet.
Kind Regards
D.
GeneralRe: Environment.CurrentDirectory is wrong... Pin
Günther M. FOIDL10-Oct-08 3:06
memberGünther M. FOIDL10-Oct-08 3:06 
GeneralRe: Environment.CurrentDirectory is wrong... Pin
nicorac13-Oct-08 20:38
membernicorac13-Oct-08 20:38 
AnswerRe: Environment.CurrentDirectory is wrong... Pin
Günther M. FOIDL13-Oct-08 21:43
memberGünther M. FOIDL13-Oct-08 21:43 
GeneralRe: Environment.CurrentDirectory is wrong... Pin
nicorac14-Oct-08 3:21
membernicorac14-Oct-08 3:21 
GeneralRe: Environment.CurrentDirectory is wrong... [modified] Pin
Günther M. FOIDL14-Oct-08 6:37
memberGünther M. FOIDL14-Oct-08 6:37 
GeneralRe: Environment.CurrentDirectory is wrong... Pin
Skylinc14-Oct-08 18:52
memberSkylinc14-Oct-08 18:52 
GeneralRe: Environment.CurrentDirectory is wrong... Pin
Günther M. FOIDL14-Oct-08 21:18
memberGünther M. FOIDL14-Oct-08 21:18 
GeneralOn deleting... Pin
pikipoki9-Oct-08 4:24
memberpikipoki9-Oct-08 4:24 
GeneralRe: On deleting... Pin
Günther M. FOIDL9-Oct-08 4:44
memberGünther M. FOIDL9-Oct-08 4:44 
GeneralRe: On deleting... Pin
dejanstanic9-Oct-08 8:08
memberdejanstanic9-Oct-08 8:08 
GeneralMultiple instances and updating multiple files Pin
TobiasP18-Oct-08 0:26
memberTobiasP18-Oct-08 0:26 
GeneralRe: Multiple instances and updating multiple files Pin
Günther M. FOIDL18-Oct-08 2:01
memberGünther M. FOIDL18-Oct-08 2:01 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Terms of Use | Mobile
Web01 | 2.8.150819.1 | Last Updated 16 Oct 2008
Article Copyright 2008 by Günther M. FOIDL
Everything else Copyright © CodeProject, 1999-2015
Layout: fixed | fluid