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

时间:2012-08-24 17:36:23

标签: c# .net dll .net-assembly assembly-resolution

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

但Visual Studio强制使用我的dll所需的确切版本。

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

大多数应用都会将它放在program.cs启动中。但是dll没有那个。

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

还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

Ben Hall有一个这样做的例子http://blog.benhall.me.uk/2006/08/appdomaincurrentdomainassemblyresolve.html

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

在尝试解析要“重定向”的类型之前,请确保已将代理分配给AssemblyResolvehttp://msdn.microsoft.com/en-us/library/system.appdomain.assemblyresolve.aspx显示了此示例。

答案 1 :(得分:1)

您可以使用assembly binding redirect吗?

<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>