Techniques to be demonstrated in this sample:

The class FSISample3 demonstrates how the loader is used to get a valid library.
We assume the simpliest use case: the panel we want to connect to is
either compatible with the most recent version of the library installed on
this system or there is exactly one version installed witch exactly fits to our
panel network. In both cases we are allowed to use the loader method
GetPreferedLibraryVersion() in order to determine the version to be loaded.   

The code which runs FSM5000FSI is nearly identical with FSISample1 but we moved
the code to method "Run" in order to seperate it from the code which is on focus in
this sample: the usage of the loader.   

Another important difference to samples without loader:
- observer objects (listener) are remotable through derivation from MarshalByRefObject
- implementation of InitializeLifetimeService for each observer to prevent the garbage collection
  to kill the stub object after a period of latency (usually five minutes)

Pre-conditions to build and run the sample:

- Copy the content of the SDKs \Bin directory into the .\sdk directory to run the sample.
- If necessary remove all versions of FSM5000FSI from the directory except the one that
fits to the version of your test panel.
- Adopt the references to FSM5000FSILoader and FSM5000FSIAPI in the project file 
(both files located in .\sdk after copying)
- Change the hardcoded settings on top of function Run() to fit your test configuration.
- If you want to have more detailed trace output you may change the line
   fsi.SetTraceLevel(SourceLevels.Warning); 
into
   fsi.SetTraceLevel(SourceLevels.Verbose); 





