在其他情况下,建议您简单地添加一个从程序集类型中删除版本的 SerializationBinder。但是,当使用在已签名程序集中找到的类型的泛型集合时,该类型将严格根据其程序集进行版本控制。
这是我发现的作品。
internal class WeaklyNamedAppDomainAssemblyBinder : SerializationBinder
{
public override Type BindToType(string assemblyName, string typeName)
{
ResolveEventHandler handler = new ResolveEventHandler(CurrentDomain_AssemblyResolve);
AppDomain.CurrentDomain.AssemblyResolve += handler;
Type returnedType;
try
{
AssemblyName asmName = new AssemblyName(assemblyName);
var assembly = Assembly.Load(asmName);
returnedType = assembly.GetType(typeName);
}
catch
{
returnedType = null;
}
finally
{
AppDomain.CurrentDomain.AssemblyResolve -= handler;
}
return returnedType;
}
Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
{
string truncatedAssemblyName = args.Name.Split(',')[0];
Assembly assembly = Assembly.Load(truncatedAssemblyName);
return assembly;
}
}
但是,导致绑定过程全局更改对我来说似乎相当危险。如果序列化发生在多个线程中,可能会发生奇怪的事情。也许更好的解决方案是对 typeName 进行一些正则表达式操作?
编辑: 基于字符串的方法不起作用。泛型显然需要一个完整的强命名类型。如果你问我,那就太令人发指了。