我有一个其他应用程序使用的DLL。它依赖于第三方dll,它会定期更新。只要我需要或更高版本存在,那么我很高兴。
但Visual Studio强制使用我的dll所需的确切版本。
我想向AppDomain.CurrentDomain.AssemblyResolve添加一个事件处理程序,以便我可以检查更高版本并使用它。但我不知道在哪里添加它。
大多数应用都会将它放在program.cs启动中。但是dll没有那个。
我会把它放在一个静态构造函数中,但我有很多类使用这个第三方dll。把这个事件附加到每个班级似乎很麻烦。
还有其他选择吗?
答案 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);
}
}
在尝试解析要“重定向”的类型之前,请确保已将代理分配给AssemblyResolve
。 http://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>