C# 如何在DLL中附加到AppDomain.CurrentDomain.AssemblyResolve

C# 如何在DLL中附加到AppDomain.CurrentDomain.AssemblyResolve,c#,.net,dll,.net-assembly,assembly-resolution,C#,.net,Dll,.net Assembly,Assembly Resolution,我有一个其他应用程序使用的dll。它依赖于定期更新的第三方dll。只要我需要的版本或更高版本存在,我就很高兴 但是VisualStudio在使用我的dll的应用程序上强制使用我需要的确切版本 我想向AppDomain.CurrentDomain.AssemblyResolve添加一个事件处理程序,这样我就可以检查更高版本并使用它。但我不知道该加在哪里 大多数应用程序都会将其放入program.cs启动程序中。但是dll没有这个功能 我会把它放在一个静态构造函数中,但我有很多类使用这个第三方dll

我有一个其他应用程序使用的dll。它依赖于定期更新的第三方dll。只要我需要的版本或更高版本存在,我就很高兴

但是VisualStudio在使用我的dll的应用程序上强制使用我需要的确切版本

我想向AppDomain.CurrentDomain.AssemblyResolve添加一个事件处理程序,这样我就可以检查更高版本并使用它。但我不知道该加在哪里

大多数应用程序都会将其放入program.cs启动程序中。但是dll没有这个功能

我会把它放在一个静态构造函数中,但我有很多类使用这个第三方dll。将此事件附加到每个类中似乎很混乱


还有其他选择吗?

Ben Hall举了一个这样做的例子:

在尝试解析要“重定向”的类型之前,请确保已将委托分配给
AssemblyResolve
。显示和示例。

您可以使用吗



第三方DLL是托管的还是非托管的?从我假设的问题来看,managed.config文件应该能够处理这个问题,不是吗?或者,使用带有时间戳的探查器来查看什么倾向于首先被击中。不过,对于一个非常不连贯的库来说,If将是很困难的。@Chris Shain-我的库和第三方库都是受管理的。@leppie-但是我必须在我的DLL的用户上强制执行配置选项。是的,但是我要附加到哪里呢?dll没有OnLoad方法让我在失败发生之前连接它。(这就是问题的重点。)就dll而言,必须先加载该dll,然后才能加载要重定向的类型。如果不在Main()中这样做,就无法保证这一点。此时,您基本上被迫在main中进行事件订阅。这是最好的解决方案。我不喜欢它,因为它迫使使用我的dll的应用程序处理这样一个事实,即我没有与它们相同的版本(我希望我的代码不会给那些忘记这么做的人带来任何麻烦)。
private Assembly AssemblyResolveHandler(object sender,ResolveEventArgs e)
{
    try
    {
        string[] assemblyDetail = e.Name.Split(',');
        string assemblyBasePath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
        Assembly assembly = Assembly.LoadFrom(assemblyBasePath + @"\" + assemblyDetail[0] + ".dll");
        return assembly;
    }
    catch (Exception ex)
    {
        throw new ApplicationException("Failed resolving assembly", ex);
    }
}
<configuration>
    <runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <dependentAssembly>
                <assemblyIdentity name="Foo.Bar" publicKeyToken="***" culture="neutral"/>
                <bindingRedirect oldVersion="0.0.0.0-2.0.0.0" newVersion="2.0.0.1"/>
            </dependentAssembly>
        </assemblyBinding>
    </runtime>
</configuration>