处理此问题的一种方法是创建一个加载 classA 的 SerializationBinder 实现,然后将对您的活页夹实例的引用传递给 Processor.dll,以便 Processor.dll 可以使用您的活页夹实现进行反序列化。这将允许您将引用 ClassA 的代码保留在 App 模块中(SerializationBinder 实现当然必须在 App 模块中定义)。
这是一个例子:给定元素库中的这个接口
public interface IElement
{
string DoSomething(string param);
}
你会像这样定义你的处理器:
public class ProcessorClass
{
private SerializationBinder _binder;
public ProcessorClass(SerializationBinder binder)
{
_binder = binder;
}
public string CallDoSomething(Stream s)
{
var formatter = new BinaryFormatter();
formatter.Binder = _binder;
var i = (IElement)formatter.Deserialize(s);
return i.DoSomething("the processor");
}
}
在这个例子中,我使用了一个非常非常简单的序列化绑定器。请注意,这必须在 App 程序集中定义,这就是为什么您不需要引用ClassA
App 之外的任何地方。
class Binder : SerializationBinder
{
//WARNING: demonstration only, DO NOT USE in production code
public override Type BindToType(string assemblyName, string typeName)
{
return Type.GetType("ClassA");
}
}
然后我们将它们放在 App 程序集中:
var ms = new MemoryStream();
var formatter = new BinaryFormatter();
var theObject = new ClassA();
formatter.Serialize(ms, theObject);
var processor = new ProcessorClass(new Binder());
ms.Seek(0, SeekOrigin.Begin);
string result = processor.CallDoSomething(ms);
有关 SerializationBinder 的另一个示例,请参阅此 MSDN 示例。