我有一个.Net标准2.0应用程序,它引用了.Net45 dll中的一些合同。我这样做的印象是,一旦这些合同对象被序列化,他们将使用.Net45程序集类型完成。使用.Net45库(这是最终目标)对这些进行去处理现在给出错误:
在JSON'System.Collections.Generic.Dictionary`2 [[System.String,System.Private.CoreLib],[System.String,System.Private.CoreLib]],System.Private.CoreLib中指定的错误解析类型“
这显然是因为它试图从标准程序集类型而不是从mscorlib解析字符串类型。有没有办法实现我的尝试?
答案 0 :(得分:0)
有很多方法可以解决这个问题。
对于无法轻松转换为自定义ISerializationBinder的大型代码库 我已经实现了重定向(虽然不漂亮,但是可以正常工作)
RedirectAssembly("System.Private.CoreLib", "mscorlib");
public static void RedirectAssembly(string fromAssemblyShotName, string replacmentAssemblyShortName)
{
Console.WriteLine($"Adding custom resolver redirect rule form:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
ResolveEventHandler handler = null;
handler = (sender, args) =>
{
// Use latest strong name & version when trying to load SDK assemblies
var requestedAssembly = new AssemblyName(args.Name);
Console.WriteLine($"RedirectAssembly > requesting:{requestedAssembly}; replacment from:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
if (requestedAssembly.Name == fromAssemblyShotName)
{
try
{
Console.WriteLine($"Redirecting Assembly {fromAssemblyShotName} to: {replacmentAssemblyShortName}");
var replacmentAssembly = Assembly.Load(replacmentAssemblyShortName);
return replacmentAssembly;
}
catch (Exception e)
{
Console.WriteLine($"ERROR while trying to provide replacement Assembly {fromAssemblyShotName} to: {replacmentAssemblyShortName}");
Console.WriteLine(e);
return null;
}
}
Console.WriteLine($"Framework faild to find {requestedAssembly}, trying to provide replacment from:{fromAssemblyShotName}, to:{replacmentAssemblyShortName}");
return null;
};
AppDomain.CurrentDomain.AssemblyResolve += handler;
}