当.net core 项目给.net framework 用easynetq发送信息的时候。出现异常,例如以string对象为例。抛出异常:“Could not load assembly 'System.Private.CoreLib'”
因为:.net core 的string 对象是在System.Private.CoreLib程序集下,System.String命名空间下;而.net framework的string对象是在mscorlib程序集下,System.String命名空间下
easynetq反序列化对象前,会拿到当前对象的类型,拿到类型之后会从对应的程序集去加载,而.net framework当然没有System.Private.CoreLib.dll,所以失败。
解决办法:替换ITypeNameSerializer组件 官方替换各种组件方法
关键源码(版本6.3.1):
private static Type GetTypeFromTypeNameKey(TypeNameKey typeNameKey) { var assemblyName = typeNameKey.AssemblyName; var typeName = typeNameKey.TypeName; if (assemblyName != null) { var assembly = Assembly.Load(new AssemblyName(assemblyName)); if (assembly == null) { throw new EasyNetQException($"Could not load assembly '{assemblyName}'"); } var type = assembly.GetType(typeName); if (type == null) { // if generic type, try manually parsing the type arguments for the case of dynamically loaded assemblies // example generic typeName format: System.Collections.Generic.Dictionary`2[[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] if (typeName.IndexOf('`') >= 0) { try { type = GetGenericTypeFromTypeName(typeName, assembly); } catch (Exception ex) { throw new EasyNetQException($"Could not find type '{typeName}' in assembly '{assembly.FullName}'", ex); } } if (type == null) { throw new EasyNetQException($"Could not find type '{typeName}' in assembly '{assembly.FullName}'"); } } return type; } return Type.GetType(typeName); }