これを処理する 1 つの方法は、classA をロードする SerializationBinder 実装を作成し、バインダーのインスタンスへの参照を Processor.dll に渡して、Processor.dll がバインダー実装を逆シリアル化に使用できるようにすることです。これにより、ClassA を参照するコードを App モジュールに保持できます (もちろん、SerializationBinder 実装は App モジュールで定義する必要があります)。
以下に例を示します: Element ライブラリにあるこのインターフェースを考える
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");
}
}
この例では、非常に単純なシリアライゼーション バインダーを使用しています。ClassA
これは App アセンブリで定義する必要があることに注意してください。そのため、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の例を参照してください。