views:

1603

answers:

5

One of my favorite things about owning a USB flash storage device is hauling around a bunch of useful tools with me. I'd like to write some tools, and make them work well in this kind of environment. I know C# best, and I'm productive in it, so I could get a windows forms application up in no time that way.

But what considerations should I account for in making a portable app? A few I can think of, but don't know answers to:

1) Language portability - Ok, I know that any machine I use it on will require a .NET runtime be installed. But as I only use a few windows machines regularly, this shouldn't be a problem. I could use another language to code it, but then I lose out on productivity especially in regards to an easy forms designer. Are there any other problems with running a .NET app from a flash drive?

2) Read/Write Cycles - In C#, how do I make sure that my application isn't writing unnecessarily to the drive? Do I always have control of writes, or are there any "hidden writes" that I need to account for?

3) Open question: are there any other issues relating to portable applications I should be aware of, or perhaps suggestions to other languages with good IDEs that would get me a similar level of productivity but better portability?

A: 

I dont actually have any experience with this so it might be best to take what I say with a pinch of salt. But here is my take on it:

You dont need to do anything special

It is not really a consideration of an application developer as to how and when writes are made to a drive, that is something that is far better controlled by the OS. I know that windows caches writes to usb drives so I would trust it do handle that.

The only consideration you do need to make is that your application will not be installed. So you need to make sure that you design it to run entirely self contained within the directory it is deployed to. You could optionally also makie some writes to the users home directory but this needs to be done through the appropriate environment variables.

I would get writing and see if there is anything special about a flash drive that the OS doesnt handle.

Jack Ryan
If the drive is optimized for quick removal, and most flash drives are, Windows will write-through and not cache.
Michael
If the drive is optimised for quick removal is there any reason not to respect the users wishes and write to it immediately? If the drive has a requirement that writes be cached then turn on the OS support for it rather than reimplement.
Jack Ryan
@JayArr - I was commenting on the statement that Windows caches writes to USB flash drives. In general, this is not true.
Michael
A: 

I don't really have answers for #1 or #3. But for #2, the .NET CLR shouldn't be writing to an app's "installation" folder (i.e. the flash drive) unless your code specifically tells it to or is using and modifying file-based settings (ini, xml, etc) that live with the app.

Number 1 is really the kicker if you're not just writing things for personal use. Obviously hosting a portable copy of the full CLR on the thumb drive is impossible. But there are tools that can scan your assembly for its dependencies and package them up into a standalone .exe so that the CLR doesn't necessarily need to be installed on the target system.

Ryan
+7  A: 
  • 1) There shouldn't be any problems running a .NET app from a flash drive.
  • 2) You should have control of most writes. Be sure you write to temp or some other location on the hard drive, and not on the flash drive. But write-cycles shouldn't be a problem - even with moderate to heavy usage most flashdrives have a life time of years.
  • 3) Just treat it like's it any app that has xcopy style deployment and try to account for your app gracefully failing if some dependency is not on the box.
Michael
+1  A: 

If you want to use com objects, use reg-free com and include the com objects with your program.

Brian
+1  A: 

You should always have control of your writes. Applications should be loaded into RAM at startup, and then memory past that is allocated in RAM, so nothing is written to the flash drive.

The most important thing for a portable application is that basically no installation is necessary for your application. You do not want to be dependant on registry values especially, since your application will not be 'installed' on other computers.

One of the issues with portable applications you may consider is data persistence. Generally, you write to a user's Application Data folder to save data. If this is the case, any data saved will only apply to the user on that computer. If you want some local application data, you may wish to create a Seralized XML file for your settings and store it locally within your application's directory. This file writing would then likely be the only write actions you'd need to worry about.

For your .NET portability issue, you could also write a small entry program in C++, which checks if the computer has .NET installed. .NET has registry values you can check to see the versions installed, so if .NET is installed, run your application, else display a message stating that .NET needs to be installed first.

Edit: I'd like to add that I do application development for Ultrasound machines using XAML in C# 3.0. The application I write works perfectly from a USB Flash Drive, while all user settings are stored on a local AppData basis, so nothing is written to the USB. While the application can be installed through an .exe installer, the installer does not write any registry values the application depends on.

Will Eddins