【发布时间】:2017-02-21 22:00:18
【问题描述】:
我遇到的问题几乎与此链接中列出的问题完全相同。 https://social.msdn.microsoft.com/Forums/vstudio/en-US/3d0eae67-2cd8-4c06-888a-650a811f1fcf/type-msinternalnamedobject-in-assembly-windowsbase-is-not-marked-as-serializable?forum=wpf
我的问题类似于原作者的问题,将 .NET 远程代理作为控件的绑定源。在我的例子中,有问题的控件是一个 TabControl,我将它的 itemsource 属性绑定到接口类型上的一个属性,该接口类型的实现是在本机代码中。
上面提到的一系列链接提到了一些解决方法。微软声称有一个修复,但它似乎是为.net 4.5 保留的,我无法移动到(我被困在 4.0 中)。关于变通办法,不幸的是,我一生都无法弄清楚在哪里应用所讨论的任何变通办法,因为它们似乎并不详细。
至少我自己发现的是 Object.Equals() 正在一个透明代理对象上被调用,该对象是绑定源接口实例,并且对象实例存储在 BindingExpressionBase 的 EffectiveTargetNullValue 属性的内容中。此属性中存储的对象实例恰好是 MS.Internal.NamedObject 类型。
我的猜测是,当一个由 .Net 远程代理表示的对象是比较操作的一部分时,比较中的两个对象都会尝试被序列化或引用,具体取决于该对象是否继承自 MarshalByRefObj。在我的情况下,MS.Internal.NamedObject 类型没有被标记为这样,并且在进行比较时,会导致我出现序列化异常。
我可以尝试提供代码来解决这个问题,但是我的项目是大型 MFC/WPF 应用程序的一部分。我要花很长时间。 MFC 应用程序加载插件,其中之一是在激活时提供一个子 WPF 窗口,MFC 本机 c++ 插件可通过 COM 互操作访问。 WPF 窗口及其服务在一个独立于在对托管 COM 互操作进行本机操作时自动创建的应用程序域中启动。这两个应用程序域通过 WCF 和 COM 事件接收器的组合进行通信。 WPF 窗口的数据源从原始 MFC 应用程序域(通过 com 互操作)传递到另一个,然后发送信号通知另一个域中的应用程序读取数据,并更新其视图。当我使用 AppDomain.SetData 方法使 MFC 中的 WPF appdomain 可以使用数据时,.NET 远程处理开始发挥作用。此时,数据本质上是一个 ComObj,由透明代理提供给 WPF 窗口。
最终我需要知道 WPF Tab 控件是否可以将其项目源绑定到由跨应用程序域的透明代理提供的 COM 对象。如果这是可能的,那么我的序列化异常是由于链接所述的 .net 4.0 中的错误,如果是,是否有解决方法?
谢谢。
【问题讨论】:
-
我刚刚编写了一个测试,显示您可以 100% 绑定到从另一个 AppDomain 代理的 MarshalByRefObject。
-
更多信息。罪魁祸首似乎是以一种或另一种方式绑定的两种方式。特别是在 TabControl 的 SelectedValue 属性上设置的两种方式绑定(尽管我确定不限于 TabControl)。