We have a plug in folder from which we load assemblies. Mostly this is fine. However, we have 1 3rd party plugin that uses System.Core Version 2.0.5.0.
We use .Net 4 so we have System.Core 4.0.0.0 loaded on on the PCs.
When loading the plug-in we get an error as System.Core Version 2.0.5.0. cannot be resolved.
I thought this would help:
<dependentAssembly>
<assemblyIdentity name="System.Core"
publicKeyToken="7cec85d7bea7798e"
culture="neutral" />
<bindingRedirect oldVersion="2.0.5.0"
newVersion="4.0.0.0"/>
</dependentAssembly>
But it didn't.
How can I force a referencing .dll to use the version of System.Core I have?
And is that the right way to do this?
==================================
This is the code we use to register the plug-ins:
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);
}
}
Rely on automatic binding redirection This means that if two components reference different versions of the same strong-named assembly, the runtime automatically adds a binding redirection to the newer version of the assembly in the output app configuration (app. config) file.
Right-click the project in Solution Explorer and select Properties. On the Application page, uncheck the Auto-generate binding redirects option. If you don't see the option, you'll need to manually disable the feature in the project file.
As far as I know, assembly redirection is only working from the end application's point of view. Hence, you have to add the redirection to the application's app.config/web.config. This is quite annoying, because it still creates a modern version of the earlier days' 'DLL hell'.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With