その他の場合は、アセンブリタイプからバージョンを削除する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の正規表現操作を行うことです。
編集: 文字列ベースの方法は機能しません。ジェネリックスには、完全に厳密に名前が付けられた型が必要なようです。あなたが私に尋ねればかなり凶悪です。