Index: /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs	(revision 2687)
+++ /trunk/sources/HeuristicLab.Hive.Server.Core/3.2/ClientCommunicator.cs	(revision 2688)
@@ -111,5 +111,5 @@
               clientAdapter.Update(client);
               HiveLogger.Info(this.ToString() + ": Client " + client.Id + " wasn't offline but hasn't sent heartbeats - Resetting all his jobs");
-              foreach (Job job in jobAdapter.GetActiveJobsOf(client)) {                
+              foreach (Job job in jobAdapter.GetActiveJobsOf(client)) {
                 jobManager.ResetJobsDependingOnResults(job);
               }
@@ -241,5 +241,5 @@
     /// <returns></returns>
     public ResponseHB ProcessHeartBeat(HeartBeatData hbData) {
-      
+
       ISession session = factory.GetSessionForCurrentThread();
       ITransaction tx = null;
@@ -252,5 +252,5 @@
           session.GetDataAdapter<ClientInfo, IClientAdapter>();
 
-        IJobAdapter jobAdapter =        
+        IJobAdapter jobAdapter =
           session.GetDataAdapter<Job, IJobAdapter>();
         HiveLogger.Info(this.ToString() + ": END Fetched Adapters");
@@ -268,5 +268,5 @@
         if (client.State == State.offline || client.State == State.nullState) {
           response.Success = false;
-          response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_USER_NOT_LOGGED_IN;          
+          response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_USER_NOT_LOGGED_IN;
           response.ActionRequest.Add(new MessageContainer(MessageContainer.MessageType.NoMessage));
 
@@ -305,5 +305,5 @@
         processJobProcess(hbData, jobAdapter, clientAdapter, response);
         HiveLogger.Info(this.ToString() + ": END Processed Heartbeat Jobs");
-        
+
         clientAdapter.Update(client);
 
@@ -331,6 +331,6 @@
     /// <param name="response"></param>
     private void processJobProcess(HeartBeatData hbData, IJobAdapter jobAdapter, IClientAdapter clientAdapter, ResponseHB response) {
-      HiveLogger.Info(this.ToString() + " processJobProcess: Started for Client " + hbData.ClientId);      
-      
+      HiveLogger.Info(this.ToString() + " processJobProcess: Started for Client " + hbData.ClientId);
+
       if (hbData.JobProgress != null && hbData.JobProgress.Count > 0) {
         List<Job> jobsOfClient = new List<Job>(jobAdapter.GetActiveJobsOf(clientAdapter.GetById(hbData.ClientId)));
@@ -338,5 +338,5 @@
           response.Success = false;
           response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_IS_NOT_BEEING_CALCULATED;
-          HiveLogger.Error(this.ToString() + " processJobProcess: There is no job calculated by this user " + hbData.ClientId);      
+          HiveLogger.Error(this.ToString() + " processJobProcess: There is no job calculated by this user " + hbData.ClientId);
           return;
         }
@@ -347,5 +347,5 @@
             response.Success = false;
             response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_IS_NOT_BEEING_CALCULATED;
-            HiveLogger.Error(this.ToString() + " processJobProcess: There is no job calculated by this user " + hbData.ClientId + " Job: " + curJob);      
+            HiveLogger.Error(this.ToString() + " processJobProcess: There is no job calculated by this user " + hbData.ClientId + " Job: " + curJob);
           } else if (curJob.State == State.abort) {
             // a request to abort the job has been set
@@ -376,7 +376,7 @@
               if (newAssignedJobs.ContainsKey(currJob.Id)) {
                 newAssignedJobs[currJob.Id]--;
-                HiveLogger.Error(this.ToString() + " processJobProcess: Job TTL Reduced by one for job: " + currJob + "and is now: " + newAssignedJobs[currJob.Id] + ". User that sucks: " + currJob.Client);                      
+                HiveLogger.Error(this.ToString() + " processJobProcess: Job TTL Reduced by one for job: " + currJob + "and is now: " + newAssignedJobs[currJob.Id] + ". User that sucks: " + currJob.Client);
                 if (newAssignedJobs[currJob.Id] <= 0) {
-                  HiveLogger.Error(this.ToString() + " processJobProcess: Job TTL reached Zero, Job gets removed: " + currJob + " and set back to offline. User that sucks: " + currJob.Client);                  
+                  HiveLogger.Error(this.ToString() + " processJobProcess: Job TTL reached Zero, Job gets removed: " + currJob + " and set back to offline. User that sucks: " + currJob.Client);
 
                   currJob.State = State.offline;
@@ -388,5 +388,5 @@
                 }
               } else {
-                HiveLogger.Error(this.ToString() + " processJobProcess: Job ID wasn't with the heartbeats:  " + currJob);                      
+                HiveLogger.Error(this.ToString() + " processJobProcess: Job ID wasn't with the heartbeats:  " + currJob);
                 currJob.State = State.offline;
                 jobAdapter.Update(currJob);
@@ -397,5 +397,5 @@
 
               if (newAssignedJobs.ContainsKey(currJob.Id)) {
-                HiveLogger.Info(this.ToString() + " processJobProcess: Job is sending a heart beat, removing it from the newAssignedJobList: " + currJob);                      
+                HiveLogger.Info(this.ToString() + " processJobProcess: Job is sending a heart beat, removing it from the newAssignedJobList: " + currJob);
                 newAssignedJobs.Remove(currJob.Id);
               }
@@ -431,5 +431,5 @@
           response.Job = computableJob;
           response.Success = true;
-          HiveLogger.Info(this.ToString() + " SendSerializedJob: Job pulled: " + computableJob.JobInfo + " for user " + clientId);                      
+          HiveLogger.Info(this.ToString() + " SendSerializedJob: Job pulled: " + computableJob.JobInfo + " for user " + clientId);
           response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_PULLED;
           lock (newAssignedJobs) {
@@ -438,5 +438,5 @@
           }
         } else {
-          HiveLogger.Info(this.ToString() + " SendSerializedJob: No more Jobs left for " + clientId);                      
+          HiveLogger.Info(this.ToString() + " SendSerializedJob: No more Jobs left for " + clientId);
           response.Success = false;
           response.Job = null;
@@ -481,5 +481,5 @@
           response.Job = job2Calculate;
           response.Success = true;
-          HiveLogger.Info(this.ToString() + " SendSerializedJob: Job pulled: " + job2Calculate + " for user " + clientId);                      
+          HiveLogger.Info(this.ToString() + " SendSerializedJob: Job pulled: " + job2Calculate + " for user " + clientId);
           response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_PULLED;
           lock (newAssignedJobs) {
@@ -491,5 +491,5 @@
           response.Job = null;
           response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_NO_JOBS_LEFT;
-          HiveLogger.Info(this.ToString() + " SendSerializedJob: No more Jobs left for " + clientId);                      
+          HiveLogger.Info(this.ToString() + " SendSerializedJob: No more Jobs left for " + clientId);
         }
 
@@ -514,5 +514,5 @@
 
       HiveLogger.Info(this.ToString() + " ProcessJobResult: BEGIN Job received for Storage - main method:");
-      
+
       ISession session = factory.GetSessionForCurrentThread();
       ITransaction tx = null;
@@ -594,9 +594,9 @@
       Exception exception,
       bool finished) {
-      
+
       HiveLogger.Info(this.ToString() + " ProcessJobResult: BEGIN Job received for Storage - SUB method: " + jobId);
 
       ISession session = factory.GetSessionForCurrentThread();
-            
+
       ITransaction tx = null;
 
@@ -608,5 +608,5 @@
         IJobResultsAdapter jobResultAdapter =
           session.GetDataAdapter<JobResult, IJobResultsAdapter>();
-        
+
         //should fetch the existing transaction        
         tx = session.BeginTransaction();
@@ -628,7 +628,7 @@
           response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_NO_JOB_WITH_THIS_ID;
           response.JobId = jobId;
-          
-          HiveLogger.Error(this.ToString() + " ProcessJobResult: No job with Id " + jobId);                      
-          
+
+          HiveLogger.Error(this.ToString() + " ProcessJobResult: No job with Id " + jobId);
+
           tx.Rollback();
           return response;
@@ -637,7 +637,7 @@
           response.Success = false;
           response.StatusMessage = ApplicationConstants.RESPONSE_COMMUNICATOR_JOB_WAS_ABORTED;
-          
-          HiveLogger.Error(this.ToString() + " ProcessJobResult: Job was aborted! " + job.JobInfo);                      
-          
+
+          HiveLogger.Error(this.ToString() + " ProcessJobResult: Job was aborted! " + job.JobInfo);
+
           tx.Rollback();
           return response;
@@ -648,5 +648,5 @@
           response.JobId = jobId;
 
-          HiveLogger.Error(this.ToString() + " ProcessJobResult: Job is not being calculated (client = null)! " + job.JobInfo);                      
+          HiveLogger.Error(this.ToString() + " ProcessJobResult: Job is not being calculated (client = null)! " + job.JobInfo);
 
           tx.Rollback();
@@ -658,5 +658,5 @@
           response.JobId = jobId;
 
-          HiveLogger.Error(this.ToString() + " ProcessJobResult: Wrong Client for this Job! " + job.JobInfo + ", Sending Client is: " + clientId);                      
+          HiveLogger.Error(this.ToString() + " ProcessJobResult: Wrong Client for this Job! " + job.JobInfo + ", Sending Client is: " + clientId);
 
           tx.Rollback();
@@ -668,5 +668,5 @@
           response.JobId = jobId;
 
-          HiveLogger.Error(this.ToString() + " ProcessJobResult: Job already finished! " + job.JobInfo + ", Sending Client is: " + clientId);                      
+          HiveLogger.Error(this.ToString() + " ProcessJobResult: Job already finished! " + job.JobInfo + ", Sending Client is: " + clientId);
 
           tx.Rollback();
@@ -682,5 +682,5 @@
           response.JobId = jobId;
 
-          HiveLogger.Error(this.ToString() + " ProcessJobResult: Wrong Job State, job is: " + job.JobInfo);                      
+          HiveLogger.Error(this.ToString() + " ProcessJobResult: Wrong Job State, job is: " + job.JobInfo);
 
           tx.Rollback();
@@ -720,8 +720,8 @@
         response.finished = finished;
         response.JobResultId = jobResult.Id;
-        
+
         //Removed for Testing
         //tx.Commit();
-        HiveLogger.Info(this.ToString() + " ProcessJobResult: END Job received for Storage - SUB method: " + jobId);        
+        HiveLogger.Info(this.ToString() + " ProcessJobResult: END Job received for Storage - SUB method: " + jobId);
         return response;
       }
@@ -772,5 +772,5 @@
 
       HiveLogger.Info("Client logged out " + clientId);
-      
+
       ISession session = factory.GetSessionForCurrentThread();
       ITransaction tx = null;
@@ -892,6 +892,6 @@
             };
 
-            foreach (String assemblyPath in currPlugin.Files) {
-              currCachedPlugin.PluginFiles.Add(File.ReadAllBytes(assemblyPath));
+            foreach (string fileName in from file in currPlugin.Files select file.Name) {
+              currCachedPlugin.PluginFiles.Add(File.ReadAllBytes(fileName));
             }
             response.Plugins.Add(currCachedPlugin);
Index: /trunk/sources/HeuristicLab.Operators.Programmable/3.2/ProgrammableOperator.cs
===================================================================
--- /trunk/sources/HeuristicLab.Operators.Programmable/3.2/ProgrammableOperator.cs	(revision 2687)
+++ /trunk/sources/HeuristicLab.Operators.Programmable/3.2/ProgrammableOperator.cs	(revision 2688)
@@ -167,5 +167,7 @@
       foreach (var plugin in ApplicationManager.Manager.Plugins) {
         var aList = new List<Assembly>();
-        foreach (var aName in plugin.Assemblies) {
+        foreach (var aName in from file in plugin.Files
+                              where file.Type == PluginFileType.Assembly
+                              select file.Name) {
           Assembly a;
           locationTable.TryGetValue(aName, out a);
@@ -198,5 +200,6 @@
             assemblies.Add(a, false);
           }
-        } catch (NotSupportedException) {
+        }
+        catch (NotSupportedException) {
           // NotSupportedException is thrown while accessing 
           // the Location property of the anonymously hosted
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs	(revision 2687)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Advanced/InstallationManager.cs	(revision 2688)
@@ -28,4 +28,5 @@
 using System.ComponentModel;
 using HeuristicLab.PluginInfrastructure.UpdateLocationReference;
+using System.Reflection;
 
 namespace HeuristicLab.PluginInfrastructure.Advanced {
@@ -67,5 +68,5 @@
       builder.Append("Build date: ").AppendLine(desc.BuildDate.ToString());
       builder.AppendLine("Files: ");
-      foreach (string fileName in desc.Files) {
+      foreach (string fileName in from file in desc.Files select file.Name) {
         builder.AppendLine(fileName);
       }
@@ -95,8 +96,8 @@
       StringBuilder builder = new StringBuilder();
       var missingFiles = from x in desc.Files
-                         where !File.Exists(x)
-                         select x;
+                         where !File.Exists(x.Name)
+                         select x.Name;
       if (missingFiles.Count() > 0) {
-        foreach (string fileName in desc.Files) {
+        foreach (string fileName in from file in desc.Files select file.Name) {
           if (!File.Exists(fileName)) builder.Append("Missing file: ").AppendLine(fileName);
         }
@@ -126,6 +127,6 @@
             // or there was a problem loading the assemblies
             builder.AppendLine("There was a problem while loading assemblies: ");
-            foreach (string assembly in desc.Assemblies) {
-              builder.AppendLine(assembly);
+            foreach (AssemblyName assembly in desc.AssemblyNames) {
+              builder.AppendLine(assembly.FullName);
             }
             return builder.ToString();
@@ -196,6 +197,6 @@
     public void Remove(IEnumerable<string> pluginNames) {
       var fileNames = from pluginToDelete in PluginDescriptionIterator.IterateDependentsTopDown(GetPluginDescriptions(pluginNames), pluginManager.Plugins)
-                      from fileName in pluginToDelete.Files
-                      select Path.Combine(pluginDir, fileName);
+                      from file in pluginToDelete.Files
+                      select Path.Combine(pluginDir, file.Name);
       var args = new PluginInfrastructureCancelEventArgs("Deleting", fileNames);
       OnPreDelete(args);
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationManager.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationManager.cs	(revision 2687)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/ApplicationManager.cs	(revision 2688)
@@ -103,6 +103,6 @@
       // 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 (string assembly in desc.Assemblies) {
-          var asm = Assembly.LoadFrom(assembly);
+        foreach (AssemblyName assemblyName in desc.AssemblyNames) {
+          var asm = Assembly.Load(assemblyName);
 
           // instantiate and load all plugins in this assembly
@@ -213,8 +213,5 @@
       PluginDescription pluginDesc = (PluginDescription)pluginDescription;
       return from asm in AppDomain.CurrentDomain.GetAssemblies()
-             where !string.IsNullOrEmpty(asm.Location) &&
-                   pluginDesc.Assemblies.Any(asmPath =>
-                     Path.GetFullPath(asmPath).Equals(Path.GetFullPath(asm.Location),
-                                                      StringComparison.CurrentCultureIgnoreCase))
+             where pluginDesc.AssemblyNames.Any(asmName => asmName.FullName.Equals(asm.GetName().FullName))
              from t in GetTypes(type, asm, onlyInstantiable)
              select t;
@@ -286,5 +283,5 @@
     public IPluginDescription GetDeclaringPlugin(Type type) {
       foreach (PluginDescription info in Plugins) {
-        if (info.Assemblies.Contains(Path.GetFullPath(type.Assembly.Location))) return info;
+        if (info.AssemblyNames.Contains(type.Assembly.GetName())) return info;
       }
       return null;
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 2687)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/HeuristicLab.PluginInfrastructure.csproj	(revision 2688)
@@ -101,4 +101,5 @@
     <Compile Include="BaseClasses\ApplicationBase.cs" />
     <Compile Include="BaseClasses\PluginBase.cs" />
+    <Compile Include="Interfaces\IPluginFile.cs" />
     <Compile Include="Interfaces\IApplicationManager.cs" />
     <Compile Include="Interfaces\IApplicationDescription.cs" />
@@ -110,4 +111,5 @@
     <Compile Include="InvalidPluginException.cs" />
     <Compile Include="Manager\ApplicationDescription.cs" />
+    <Compile Include="Manager\PluginFile.cs" />
     <Compile Include="Manager\PluginInfrastructureCancelEventArgs.cs" />
     <Compile Include="Manager\PluginDescription.cs" />
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPluginDescription.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPluginDescription.cs	(revision 2687)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPluginDescription.cs	(revision 2688)
@@ -47,10 +47,5 @@
     /// Gets the file names of files that are part of the plugin.
     /// </summary>
-    IEnumerable<string> Files { get; }
-
-    /// <summary>
-    /// Get a list of assembly names associated with the plugin.
-    /// </summary>
-    IEnumerable<string> Assemblies { get; }
+    IEnumerable<IPluginFile> Files { get; }
   }
 }
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPluginFile.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPluginFile.cs	(revision 2688)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Interfaces/IPluginFile.cs	(revision 2688)
@@ -0,0 +1,39 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+
+namespace HeuristicLab.PluginInfrastructure {
+  /// <summary>
+  /// Represents a file of a plugin (name and type).
+  /// </summary>
+  public interface IPluginFile {
+    /// <summary>
+    /// Gets the name of the file.
+    /// </summary>
+    string Name { get; }
+    /// <summary>
+    /// Gets the type of the file.
+    /// </summary>
+    PluginFileType Type { get; }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginDescription.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginDescription.cs	(revision 2687)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginDescription.cs	(revision 2688)
@@ -24,4 +24,5 @@
 using System.Text;
 using System.Linq;
+using System.Reflection;
 
 namespace HeuristicLab.PluginInfrastructure.Manager {
@@ -77,14 +78,14 @@
 
 
-    private List<string> files = new List<string>();
+    private List<PluginFile> files = new List<PluginFile>();
     /// <summary>
     /// Gets the names of all files that belong to this plugin.
     /// These files are deleted when the plugin is removed or updated.
     /// </summary>
-    public IEnumerable<string> Files {
-      get { return files; }
+    public IEnumerable<IPluginFile> Files {
+      get { return files.Cast<IPluginFile>(); }
     }
 
-    internal void AddFiles(IEnumerable<string> fileNames) {
+    internal void AddFiles(IEnumerable<PluginFile> fileNames) {
       files.AddRange(fileNames);
     }
@@ -105,15 +106,14 @@
     }
 
-    private List<string> assemblies = new List<string>();
+    private List<AssemblyName> assemblyNames = new List<AssemblyName>();
     /// <summary>
     /// Gets the names of the assemblies that belong to this plugin.
     /// </summary>
-    public IEnumerable<string> Assemblies {
-      get { return assemblies; }
-      // set { assemblies = value; }
+    public IEnumerable<AssemblyName> AssemblyNames {
+      get { return assemblyNames; }
     }
 
-    internal void AddAssemblies(IEnumerable<string> assemblyNames) {
-      assemblies.AddRange(assemblyNames);
+    internal void AddAssemblyNames(IEnumerable<AssemblyName> assemblyNames) {
+      this.assemblyNames.AddRange(assemblyNames);
     }
 
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginFile.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginFile.cs	(revision 2688)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginFile.cs	(revision 2688)
@@ -0,0 +1,50 @@
+#region License Information
+/* HeuristicLab
+ * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
+ *
+ * This file is part of HeuristicLab.
+ *
+ * HeuristicLab is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * HeuristicLab is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with HeuristicLab. If not, see <http://www.gnu.org/licenses/>.
+ */
+#endregion
+
+using System;
+using System.Collections.Generic;
+using System.Text;
+using System.Linq;
+using System.Reflection;
+
+namespace HeuristicLab.PluginInfrastructure.Manager {
+  [Serializable]
+  public sealed class PluginFile : IPluginFile {
+    #region IPluginFile Members
+
+    private string name;
+    public string Name {
+      get { return name; }
+    }
+
+    private PluginFileType type;
+    public PluginFileType Type {
+      get { return type; }
+    }
+
+    #endregion
+
+    public PluginFile(string name, PluginFileType type) {
+      this.name = name;
+      this.type = type;
+    }
+  }
+}
Index: /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs
===================================================================
--- /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs	(revision 2687)
+++ /trunk/sources/HeuristicLab.PluginInfrastructure/Manager/PluginValidator.cs	(revision 2688)
@@ -172,6 +172,6 @@
       foreach (var desc in pluginDescriptions.Where(x => x.PluginState != PluginState.Disabled)) {
         try {
-          foreach (var asm in desc.Assemblies) {
-            Assembly.ReflectionOnlyLoadFrom(asm);
+          foreach (var asmName in desc.AssemblyNames) {
+            Assembly.ReflectionOnlyLoad(asmName.FullName);
           }
         }
@@ -237,7 +237,7 @@
       // get all attributes of that type
       IList<CustomAttributeData> attributes = CustomAttributeData.GetCustomAttributes(pluginType);
-      List<string> pluginAssemblies = new List<string>();
+      List<AssemblyName> pluginAssemblyNames = new List<AssemblyName>();
       List<string> pluginDependencies = new List<string>();
-      List<string> pluginFiles = new List<string>();
+      List<PluginFile> pluginFiles = new List<PluginFile>();
       string pluginName = null;
       string pluginDescription = null;
@@ -254,7 +254,7 @@
           string pluginFileName = (string)attributeData.ConstructorArguments[0].Value;
           PluginFileType fileType = (PluginFileType)attributeData.ConstructorArguments[1].Value;
-          pluginFiles.Add(Path.GetFullPath(Path.Combine(PluginDir, pluginFileName)));
+          pluginFiles.Add(new PluginFile(Path.GetFullPath(Path.Combine(PluginDir, pluginFileName)), fileType));
           if (fileType == PluginFileType.Assembly) {
-            pluginAssemblies.Add(Path.GetFullPath(Path.Combine(PluginDir, pluginFileName)));
+            pluginAssemblyNames.Add(AssemblyName.GetAssemblyName(Path.GetFullPath(Path.Combine(PluginDir, pluginFileName))));
           }
         }
@@ -268,5 +268,5 @@
       if (!string.IsNullOrEmpty(pluginName) &&
           pluginFiles.Count > 0 &&
-          pluginAssemblies.Count > 0 &&
+          pluginAssemblyNames.Count > 0 &&
           buildDates.Count() == 1) {
         // create a temporary PluginDescription that contains the attribute values
@@ -276,5 +276,5 @@
         info.Version = pluginType.Assembly.GetName().Version;
         info.BuildDate = DateTime.Parse(buildDates.Single(), System.Globalization.CultureInfo.InvariantCulture);
-        info.AddAssemblies(pluginAssemblies);
+        info.AddAssemblyNames(pluginAssemblyNames);
         info.AddFiles(pluginFiles);
 
@@ -349,6 +349,6 @@
                                                                                 .Where(x => x.PluginState != PluginState.Disabled))) {
         List<Type> types = new List<Type>();
-        foreach (string assembly in desc.Assemblies) {
-          var asm = Assembly.LoadFrom(assembly);
+        foreach (AssemblyName assemblyName in desc.AssemblyNames) {
+          var asm = Assembly.Load(assemblyName);
           foreach (Type t in asm.GetTypes()) {
             if (typeof(IPlugin).IsAssignableFrom(t)) {
@@ -379,5 +379,5 @@
 
     private bool CheckPluginFiles(PluginDescription pluginDescription) {
-      foreach (string filename in pluginDescription.Files) {
+      foreach (string filename in pluginDescription.Files.Select(x => x.Name)) {
         if (!FileLiesInDirectory(PluginDir, filename) ||
           !File.Exists(filename)) {
