我使用BinaryFormatter来序列化动态加载的程序集中存在的类型的对象。我们的想法是序列化对象,通过网络发送它,然后反序列化并使用它。但是我收到了这个错误:
[A] Samples.RecordKeeping.Person无法转换为 [B] Samples.RecordKeeping.Person。 A型来自'样品, 上下文中的Version = 1.0.3.0,Culture = neutral,PublicKeyToken = null' 位于'C:\ Samples.dll'的'默认'。 B型起源于 'Samples,Version = 1.0.3.0,Culture = neutral,PublicKeyToken = null'in 位于'C:\ Temp \ Samples.dll'的上下文'LoadFrom'。“}
两个大会都是一样的。即从同一位置复制,因此它们不能具有命名空间或其他类型名称问题。两个程序集都在发送和接收位置动态加载到AppDomain中
类声明是这样的:
namespace Samples.RecordKeeping
{
[Serializable]
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public string Notes { get; set; }
}
}
private INodeTask LoadUserCode()
{
INodeTask ret = null;
try
{
var type = typeof(AssemblyLoader);
var loader = (AssemblyLoader) AppDomain.CurrentDomain.CreateInstanceAndUnwrap(type.Assembly.FullName, type.FullName);
var assembly = loader.GetAssembly(_assembly);
var filename =Path.GetFileNameWithoutExtension(_assembly);
foreach (var it in assembly.GetTypes())
{
if (string.Compare(it.Name, _class, true) == 0)
{
ret = assembly.CreateInstance(it.FullName, true,
BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Instance | BindingFlags.CreateInstance,
null, null, CultureInfo.CurrentCulture,
null) as INodeTask;
break;
}
}
}
catch (Exception ex)
{
_journal.Error(ex, $"Failed to load assembly {_assembly} for {_class}");
}
return ret;
}
class AssemblyLoader : MarshalByRefObject
{
public Assembly GetAssembly(string assemblyPath)
{
var assembly = (Assembly) null;
try
{
if (File.Exists(assemblyPath))
assembly = Assembly.LoadFrom(assemblyPath);
else
throw new FileNotFoundException($"could not find {assemblyPath}");
}
catch (Exception ex)
{
throw;
}
return assembly;
}
}