Click here to Skip to main content
15,875,581 members
Articles / Desktop Programming / MFC
Article

No Touch deployment

Rate me:
Please Sign up or sign in to vote.
2.69/5 (10 votes)
20 Dec 20024 min read 86.4K   672   33   4
Describes a method for downloading and loading code dynamically over the web.

The day in class when the term “No touch deployment” was mentioned I tried to locate the code demoed in all the .NET Beta seminars I attended. Unable to find the code, I found the document distributed in class. This document led me to the Assembly class – where I was able to create the demo project in Figure 1.

Figure 1

C#
Form frmTemp;

Assembly SimpAsm = Assembly.LoadFrom("http://Duron/asms/ClassLibrary1.dll");

frmTemp = (Form)SimpAsm.CreateInstance("ClassLibrary1.frmLoadMe");

frmTemp.Show();

Then in class a week latter, all these issues where addressed. I had not tested the demo, but I was under the impression it would load the DLL from the cache or from some the Temporary Download folder if a connection to the server was lost. When I did test it by shutting off the web site from the IIS administration tool (inetmgr.exe), I got the following results. The demo did pull the DLL from cache after it had previously downloaded it and was still running when the site was shut down.

This was on of the issues brought up in class. If the user was off-line, the DLL should still be accessible. In other words, every necessary file should be installed under the assumption the user will always be disconnected to the Internet. If the user is connected, updates should be automatically downloaded. In the event when launching the application after updates have been received, these updates should still work off line. To do this the DLL needed to be accessible.

I agreed with the presentation in the class, the best way would be to download the DLL to the hard drive or current working directory, compare it with a previous version of the DLL and then load the new DLL.

I wanted to do something simple like that in Figure 2, but that didn’t work. Here, strTemp represents the URL to the DLL.

Figure 2

C#
if(File.Exists(strTemp))
{
    MessageBox.Show("Found it!");
    //File.Copy(strTemp, "lib.dll", true);
}
else
    MessageBox.Show("Nope!");

In playing around, I stumbled across the WebRequest and WebResponse classes. I created the demo in Figure 3 adapted from the code found in MSDN Library. I figure it isn’t my code - I never use “my” in naming variables. Anyway, again strTemp equals the URL to the DLL.

Figure 3

C#
WebRequest myRequest = WebRequest.Create(strTemp);

// Return the response. 
WebResponse myResponse = myRequest.GetResponse();

MessageBox.Show(myResponse.ContentType + " " + myResponse.ContentLength.ToString());

// Code to use the WebResponse goes here.

// Close the response to free resources.
myResponse.Close();

This was great, because it displayed the number of bytes read from DLL on the web site. So did it download it somewhere to get this? I searched the MSDN Library again and discovered WebRequest’s progenitors, if you will: HttpWebRequest and HttpWebResponse. The created response object had a GetResponseStream member function! Sweet, we know streams!

After reading from the stream and writing the DLL to the current directory, I wanted to compare this DLL to the original one. See the code in the solution.

The solution includes two projects, one a simple C# forms application and a simple class library project that includes its own form. Compile both and copy the ClassLibrary1.DLL to the directory on the server hosting the web server or a virtual directory of the web server. Also, before running the AsmLoadFromApp application make sure you point the web request to the right place. Note: I hard coded the server name in the request.

The last part of the project was to determine the differences in the two files. On a quick inspection of the File class, I found a GetCreationTime static method. A good old, high level C# class! (I guess that is "good new C# class".)

Upon through testing, unfortunately comparing time stamps didn’t work. Every time the file was downloaded, it had a different creation time. Due to lack of time and probably desire too, I resorted to just replacing the old file all the time. This caused a problem though. Well, it just forces the user to shut down the application if he wants updates next time he runs it. The problem is like the one where you use the FromFile static method on the Image class. It is my understanding that the instance of the application has already downloaded and created the file. The reference to that file has already been popped off the stack and Windows still thinks it is being used. We seemed to be forced to just use the old file.

I hope some of this information was useful. I’m bummed it doesn’t seem clear how to compare files. I guess once it is downloaded the first time, you can set some flag and skip over the now unnecessary downloading. Even though it is just pulling it from the cache now unless the request somehow determines a change had been made to the file on the server. Discovering this supposed changed event would be slick. But finding this event was one of the purposes for this dang project anyway! Sorry, now I’m just venting.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Software Developer
United States United States
I enjoy messing with application development and some Web development technologies. Right now I work in Virginia as a contractor to the government.

I am a Microsoft Cert. Professional and I got my 4 year BS degree.

See web site for resume and other code samples.

Comments and Discussions

 
GeneralOneClick deployment Pin
MJDamron20-Jan-06 8:37
MJDamron20-Jan-06 8:37 
GeneralUpdates Pin
MJDamron30-Jan-03 11:28
MJDamron30-Jan-03 11:28 
Generallook at this example Pin
andy_net24-Dec-02 6:48
andy_net24-Dec-02 6:48 
The whitepaper on gotdotnet goes into detail about how to build a component updater

http://www.gotdotnet.com/team/windowsforms/appupdater.aspx

andy
GeneralTip, maybe Pin
leppie22-Dec-02 1:10
leppie22-Dec-02 1:10 

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

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