我们有一个插件文件夹,我们从中加载程序集。 大多数情况下,这很好。但是,我们有1个使用System.Core版本2.0.5.0的第三方插件。
我们使用.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 :(得分:0)
据我所知,程序集重定向仅从最终应用程序的角度来看。因此,您必须将重定向添加到应用程序的app.config / web.config中。这非常令人讨厌,因为它仍然创造了早期'DLL地狱'的现代版本。
答案 1 :(得分:0)
上面的陈述是完全正确的-要进行传统的程序集绑定重定向,您必须将重定向添加到应用程序的app.config / web.config文件(将重定向添加到实际的PC的machine.config文件也可以)。
在为SDL Trados Studio 2017开发插件时遇到了相同的问题。我不想让用户编辑他们的machine.config或SdlTradosStudio.exe.config文件,那该怎么办?>
最后,我添加了一个事件处理程序,该事件处理程序在装入所请求的程序集时更改其版本信息。完整的答案在这里: