Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我可以在引用程序集中的程序集上使用bindingRedirect吗_C#_.net_Clr - Fatal编程技术网

C# 我可以在引用程序集中的程序集上使用bindingRedirect吗

C# 我可以在引用程序集中的程序集上使用bindingRedirect吗,c#,.net,clr,C#,.net,Clr,我们有一个插件文件夹,从中加载程序集。 基本上这是好的。但是,我们有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"

我们有一个插件文件夹,从中加载程序集。 基本上这是好的。但是,我们有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>

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

上述语句完全正确——要执行传统的程序集绑定重定向,必须将重定向添加到应用程序的app.config/web.config文件中(将重定向添加到实际PC的machine.config文件也可以)

我在为SDL Trados Studio 2017开发插件时遇到了同样的问题。我不想让用户编辑他们的machine.config或SdlTradosStudio.exe.config文件,那么该怎么办

最后,我添加了一个事件处理程序,在加载请求的程序集时更改其版本信息。完整答案如下:

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);
    }
}