Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs	(revision 2689)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs	(revision 2690)
@@ -127,6 +127,6 @@
             // or there was a problem loading the assemblies
             builder.AppendLine("There was a problem while loading assemblies: ");
-            foreach (AssemblyName assembly in desc.AssemblyNames) {
-              builder.AppendLine(assembly.FullName);
+            foreach (string assemblyLocation in desc.AssemblyLocations) {
+              builder.AppendLine(assemblyLocation + ": " + AssemblyName.GetAssemblyName(assemblyLocation).FullName);
             }
             return builder.ToString();
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationManager.cs	(revision 2689)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationManager.cs	(revision 2690)
@@ -75,5 +75,4 @@
       loadedAssemblies = new Dictionary<string, Assembly>();
       loadedPlugins = new List<IPlugin>();
-      // needed for the special case when assemblies are loaded dynamically via LoadAssemblies()
       AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => {
         if (loadedAssemblies.ContainsKey(args.Name)) {
@@ -103,7 +102,7 @@
       // load all loadable plugins (all dependencies available) into the execution context
       foreach (var desc in PluginDescriptionIterator.IterateDependenciesBottomUp(plugins.Where(x => x.PluginState != PluginState.Disabled))) {
-        foreach (AssemblyName assemblyName in desc.AssemblyNames) {
-          var asm = Assembly.Load(assemblyName);
-
+        foreach (string fileName in desc.AssemblyLocations) {
+          var asm = Assembly.LoadFrom(fileName);
+          RegisterLoadedAssembly(asm);
           // instantiate and load all plugins in this assembly
           foreach (var plugin in GetInstances<IPlugin>(asm)) {
@@ -213,5 +212,5 @@
       PluginDescription pluginDesc = (PluginDescription)pluginDescription;
       return from asm in AppDomain.CurrentDomain.GetAssemblies()
-             where pluginDesc.AssemblyNames.Any(asmName => asmName.FullName.Equals(asm.GetName().FullName))
+             where pluginDesc.AssemblyLocations.Any(location => location.Equals(Path.GetFullPath(asm.Location), StringComparison.CurrentCultureIgnoreCase))
              from t in GetTypes(type, asm, onlyInstantiable)
              select t;
@@ -283,5 +282,5 @@
     public IPluginDescription GetDeclaringPlugin(Type type) {
       foreach (PluginDescription info in Plugins) {
-        if (info.AssemblyNames.Contains(type.Assembly.GetName())) return info;
+        if (info.AssemblyLocations.Contains(Path.GetFullPath(type.Assembly.Location))) return info;
       }
       return null;
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginDescription.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginDescription.cs	(revision 2689)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginDescription.cs	(revision 2690)
@@ -106,14 +106,10 @@
     }
 
-    private List<AssemblyName> assemblyNames = new List<AssemblyName>();
+    
     /// <summary>
-    /// Gets the names of the assemblies that belong to this plugin.
+    /// Gets the locations (file names) of the assemblies that belong to this plugin.
     /// </summary>
-    public IEnumerable<AssemblyName> AssemblyNames {
-      get { return assemblyNames; }
-    }
-
-    internal void AddAssemblyNames(IEnumerable<AssemblyName> assemblyNames) {
-      this.assemblyNames.AddRange(assemblyNames);
+    public IEnumerable<string> AssemblyLocations {
+      get { return Files.Where(f => f.Type == PluginFileType.Assembly).Select(f => f.Name); }
     }
 
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs	(revision 2689)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs	(revision 2690)
@@ -68,6 +68,10 @@
     }
 
+    private Dictionary<string, Assembly> reflectionOnlyAssemblies = new Dictionary<string, Assembly>();
     private Assembly ReflectionOnlyAssemblyResolveEventHandler(object sender, ResolveEventArgs args) {
-      return Assembly.ReflectionOnlyLoad(args.Name);
+      if (reflectionOnlyAssemblies.ContainsKey(args.Name))
+        return reflectionOnlyAssemblies[args.Name];
+      else
+        return Assembly.ReflectionOnlyLoad(args.Name);
     }
 
@@ -147,5 +151,5 @@
     }
 
-    private static IEnumerable<Assembly> ReflectionOnlyLoadDlls(string baseDir) {
+    private IEnumerable<Assembly> ReflectionOnlyLoadDlls(string baseDir) {
       List<Assembly> assemblies = new List<Assembly>();
       // recursively load .dll files in subdirectories
@@ -156,5 +160,7 @@
       foreach (string filename in Directory.GetFiles(baseDir, "*.dll")) {
         try {
-          assemblies.Add(Assembly.ReflectionOnlyLoadFrom(filename));
+          Assembly asm = Assembly.ReflectionOnlyLoadFrom(filename);
+          RegisterLoadedAssembly(asm);
+          assemblies.Add(asm);
         }
         catch (BadImageFormatException) { } // just ignore the case that the .dll file is not a CLR assembly (e.g. a native dll)
@@ -172,6 +178,13 @@
       foreach (var desc in pluginDescriptions.Where(x => x.PluginState != PluginState.Disabled)) {
         try {
-          foreach (var asmName in desc.AssemblyNames) {
-            Assembly.ReflectionOnlyLoad(asmName.FullName);
+          foreach (var asmLocation in desc.AssemblyLocations) {
+            // the assembly must have been loaded in ReflectionOnlyDlls
+            // so we simply determine the name of the assembly and try to find it in the cache of loaded assemblies
+            var asmName = AssemblyName.GetAssemblyName(asmLocation);
+
+            if (!reflectionOnlyAssemblies.ContainsKey(asmName.FullName)) {
+              desc.Disable();
+              break; // as soon as one assembly is not available disable the plugin and check the next plugin description
+            }
           }
         }
@@ -237,5 +250,4 @@
       // get all attributes of that type
       IList<CustomAttributeData> attributes = CustomAttributeData.GetCustomAttributes(pluginType);
-      List<AssemblyName> pluginAssemblyNames = new List<AssemblyName>();
       List<string> pluginDependencies = new List<string>();
       List<PluginFile> pluginFiles = new List<PluginFile>();
@@ -255,7 +267,4 @@
           PluginFileType fileType = (PluginFileType)attributeData.ConstructorArguments[1].Value;
           pluginFiles.Add(new PluginFile(Path.GetFullPath(Path.Combine(PluginDir, pluginFileName)), fileType));
-          if (fileType == PluginFileType.Assembly) {
-            pluginAssemblyNames.Add(AssemblyName.GetAssemblyName(Path.GetFullPath(Path.Combine(PluginDir, pluginFileName))));
-          }
         }
       }
@@ -267,7 +276,7 @@
       // minimal sanity check of the attribute values
       if (!string.IsNullOrEmpty(pluginName) &&
-          pluginFiles.Count > 0 &&
-          pluginAssemblyNames.Count > 0 &&
-          buildDates.Count() == 1) {
+          pluginFiles.Count > 0 &&                                   // at least on file
+          pluginFiles.Any(f => f.Type == PluginFileType.Assembly) && // at least on assembly
+          buildDates.Count() == 1) {                                 // build date must be declared
         // create a temporary PluginDescription that contains the attribute values
         PluginDescription info = new PluginDescription();
@@ -276,5 +285,4 @@
         info.Version = pluginType.Assembly.GetName().Version;
         info.BuildDate = DateTime.Parse(buildDates.Single(), System.Globalization.CultureInfo.InvariantCulture);
-        info.AddAssemblyNames(pluginAssemblyNames);
         info.AddFiles(pluginFiles);
 
@@ -349,6 +357,7 @@
                                                                                 .Where(x => x.PluginState != PluginState.Disabled))) {
         List<Type> types = new List<Type>();
-        foreach (AssemblyName assemblyName in desc.AssemblyNames) {
-          var asm = Assembly.Load(assemblyName);
+        foreach (string assemblyLocation in desc.AssemblyLocations) {
+          // now load the assemblies into the execution context
+          var asm = Assembly.LoadFrom(assemblyLocation);
           foreach (Type t in asm.GetTypes()) {
             if (typeof(IPlugin).IsAssignableFrom(t)) {
@@ -393,4 +402,10 @@
     }
 
+    // register assembly in the assembly cache for the ReflectionOnlyAssemblyResolveEvent
+    private void RegisterLoadedAssembly(Assembly asm) {
+      reflectionOnlyAssemblies.Add(asm.FullName, asm);
+      reflectionOnlyAssemblies.Add(asm.GetName().Name, asm); // add short name
+    }
+
     internal void OnPluginLoaded(PluginInfrastructureEventArgs e) {
       if (PluginLoaded != null)
