2014-02-26 40 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地獄」的現代版本。

相關問題