Re: [Banshee-List] Integration with NewStuffManager



2006/10/11, Sebastian Pölsterl <marduk k-d-w org>:
Hi!

I'm the author of NewStuffManager
(http://www.k-d-w.org/clipboard/NewStuffManager) and would love to see
banshee using it.

I already did some work. But I got some questions:

- What would be the best to use as an unique id for the plugins. This id
should help unloading and reloading the plugins. Currently, I'm using
plugin.GetType().Module.Name as plugin_id. I have the idea that new
FileInfo( Path.Combine(Paths.UserPluginDirectory, plugin_id) ) could
reload the plugin. Does that actually work?

Depending on what you want to do with it, and how unique it has to be,
there are some options: (replace "typeof(TheClass)" with
"MyInstanceOfTheClass.GetType()" if needed)

* typeof(TheClass).GUID is *the* unique identifier for a class.
Unfortunatly, this only works if the class defines a GUID in the first
place (using System.Runtime.InterropService.GuidAttribute on the
class) which they probably don't do.

* typeof(TheClass).FullName will give you the fully qualified name of
the class, that is "NameSpace.TheClass" which should be fairly unique.

* typeof(TheClass).Name which will give you the class name, without
namespace information.

* And as you mentioned yourself, you can also use the actual DLL file
name from the Module member.

Regarding reloading the plugins, you need to use reflection again. But
as microsoft decided that DLL's cannot be unloaded at runtime once
they are loaded, this will only work if they were loaded into a
separate AppDomain (which can be destroyed, which effectively unloads
all its assemblies). Maybe mono doesn't have this limitation, not
sure.

- Afaik the each plugin hasn't its own version atm (please correct me).
But this would be neccesary to compare versions.

You can always get the version info by reflecting the assembly where
the type is defined (i.e. the plugin's DLL file):

Version thisVersion = typeof(TheClass).Assembly.GetName().Version
Version repositoryVersion = new Version(versionString);
if (thisVersion < repositoryVersion)
  TellUserThatThereAreUpdatesAvailable();

The Version class consists of the fields "Major", "Minor", "Build" and
"Revision", but the overloaded comparison operators should be
sufficient for you.

This method depends on that the plugins define their correct versions
in their respective AssemblyInfo.cs file. Not sure if this is the case
(they *should* do so, so it's a bug if the don't IMHO). By default,
.NET assemblies will have version 1.0.x.y where x and y is auto
incremented by the compiler.

Hope this helps.
Isak



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]