BinaryFormatter#Deserialize

10月の日記で言及したことがあるが、現在ターゲットにしているスマートクライアントはアプリケーション間のIPCを実現するために、Win32のWM_COPYDATAメッセージとバイナリフォーマッタを使用している。(続 NativeWindowクラス)
この方法は全く問題無いように見えたが、IPCを行う2つのアプリケーションが、互いに異なるAppDomainからロードされたアセンブリだった場合には問題が発生することが解った。
一方のAppDomainのWindowからSendMessageされたWM_COPYDATAメッセージ経由でシリアライズされたオブジェクトのストリームを、もう一方のAppDomain、つまり受け側で標題のクラスとメソッドを使用して、オブジェクトに組み立てようとすると、System.Runtime.Serialization.SerializationExceptionが発生し、以下のスタックトレースを吐いて止まった。

at System.Runtime.Serialization.Formatters.Binary.BinaryAssemblyInfo.GetAssembly()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.GetType(BinaryAssemblyInfo assemblyInfo, String name)
at System.Runtime.Serialization.Formatters.Binary.ObjectMap..ctor(String objectName, String memberNames, BinaryTypeEnum binaryTypeEnumA, Object typeInformationA, Int32 memberAssemIds, ObjectReader objectReader, Int32 objectId, BinaryAssemblyInfo assemblyInfo, SizedArray assemIdToAssemblyTable)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryObjectWithMapTyped record)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.ReadObjectWithMapTyped(BinaryHeaderEnum binaryHeaderEnum)
at System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run()
at System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler handler, __BinaryParser serParser, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream, HeaderHandler handler, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage)
at System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(Stream serializationStream)

ここまではよくある光景なのだが、問題は例外原因のメッセージ

"Unable to find assembly 'アセンブリ名, Version=1.0.2142.39554, Culture=neutral, PublicKeyToken=null'."

例外のクラス名からしてシリアライズ/デシリアライズに問題があると思ったのだが、なんとかアセンブリが見つからないらしい。スタックトレースから原因と対処に皆目検討がつかない例外は久しぶりだ。取り敢えずは情報収集と思ったが今日はもう眠い。