2014-02-26 36 views
9

我们有一个插件文件夹,我们可以从中加载程序集。 这很好。但是,我们有1个使用System.Core版本2.0.5.0的第三方插件。我可以在引用程序集内的Assembly上使用bindingRedirect

我们使用.Net 4,因此我们在PC上加载了System.Core 4.0.0.0。

加载插件时,我们得到System.Core版本2.0.5.0的错误。无法解决。

我认为这将有助于:

<dependentAssembly> 
    <assemblyIdentity name="System.Core" 
         publicKeyToken="7cec85d7bea7798e" 
         culture="neutral" /> 
    <bindingRedirect oldVersion="2.0.5.0" 
        newVersion="4.0.0.0"/> 
    </dependentAssembly> 

但事实并非如此。

如何强制引用.dll以使用我有的System.Core版本?

这是正确的方法吗?

==================================

这是我们使用注册代码插件:

internal class TestCode 
{ 
    FileInfo[] assemblies; 

    public void GoFish() 
    { 
     AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve; 

     foreach (string directory in Directory.GetDirectories(@"E:\Plugins")) 
     { 
      assemblies = new DirectoryInfo(directory).GetFiles("*.dll"); 
      foreach (string assemblyFile in Directory.GetFiles(directory, "*.dll")) 
      { 
       try 
       { 
        FileInfo fi = new FileInfo(assemblyFile); 
        var assembly = Assembly.LoadFile(fi.FullName); 
        IntegrationAssemblyAttribute integrationAssemblyAttribute = (IntegrationAssemblyAttribute)assembly.GetCustomAttribute(typeof(IntegrationAssemblyAttribute)); 
       } 
       catch (Exception ex) 
       { 
        //Exception handling 
        Console.WriteLine("An error has occured while loading plugin from loacation:{0}\n{1}", assemblyFile, ex); 
       } 
      } 
     } 
    } 

    Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) 
    { 
     var reference = assemblies.FirstOrDefault(file => file.Name == args.Name.Split(',').ToList()[0] + ".dll"); 
     if (null == reference) 
     { 
      return null; 
     } 
     return Assembly.LoadFile(reference.FullName); 

    } 
} 

public sealed class IntegrationAssemblyAttribute : Attribute 
{ 
    public Guid Guid { get; set; } 
    public IntegrationAssemblyAttribute(string assemblyGuid) 
    { 
     Guid = Guid.Parse(assemblyGuid); 
    } 
} 

回答

0

据我所知,程序集重定向只从最终应用程序的角度来看。因此,您必须将重定向添加到应用程序的app.config/web.config。这非常烦人,因为它仍然创建了早期“DLL地狱”的现代版本。

相关问题