MS.Internal.NamedObject未标记为可序列化

时间:2016-10-12 23:11:02

标签: c# c++ .net wpf mfc

我遇到的问题几乎与此链接中列出的问题完全相同。 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)。关于变通方法,不幸的是,我不能为我的生活找出应用所讨论的任何变通方法的地方,因为它们似乎并不详细。

我自己发现的至少是在TransparentProxy对象上调用Object.Equals(),该对象是绑定源接口实例,而对象实例存储在BindingExpressionBase的EffectiveTargetNullValue属性的内容中。存储在此属性中的此对象实例恰好是MS.Internal.NamedObject类型。

我的猜测是,当.Net远程处理代理所代表的对象是比较操作的一部分时,会尝试对比较中的两个对象进行序列化或引用,具体取决于对象是否继承自MarshalByRefObj。在我的情况下,MS.Internal.NamedObject类型没有标记为这样,并且当它进行比较时,会导致序列化异常。

我可以尝试提供可以解决此问题的代码,但是我的项目是大型MFC / WPF应用程序的一部分。这需要我很长时间。 MFC应用程序加载插件,其中一个插件在激活时提供可通过COM互操作访问MFC本机c ++插件的子WPF窗口。 WPF窗口及其服务在appdomain中启动,该appdomain与在执行托管COM互操作本机时自动创建的appdomain不同。这两个应用程序域通过WCF和COM事件接收器的组合进行通信。 WPF窗口的数据源从原始MFC appdomain(通过com interop)传递到另一个,然后发送信号以通知另一个域中的应用程序读取数据,并更新其视图。 .NET远程处理开始发挥作用,因为我使用AppDomain.SetData方法使数据可用于来自MFC的WPF应用程序域。此时数据本质上是一个ComObj,由TransparentProxy提供给WPF窗口。

最终我需要知道WPF Tab控件是否可以将其项源绑定到跨越appdomains的透明代理提供的COM对象。如果这是可能的,那么由于链接所述的.net 4.0中的错误导致我的序列化异常,如果有,是否有解决方法?

感谢。

1 个答案:

答案 0 :(得分:0)

将.NET远程代理的集合绑定到WPF ItemsControl时,我恰好遇到了此问题。同样,比较操作位于异常堆栈跟踪的根部。 DataTemplate中的DataTemplate绑定和控件绑定实际上适用于前几个调用(ItemsControl.DataContext是从列表中选定的项中提取的),但随后引发了异常。

代理绑定最初起作用的事实使我怀疑问题在于ItemsControl如何处理其内部ItemsSource绑定状态。

我的解决方法是不使用ItemsSource绑定,而是手动创建ContentControl并将其添加到Items集合中。 ContentControl将向UserControl.Resources查询匹配的DataTemplate

var contentControl = new ContentControl { Content = input };
_inputsItemsControl.Items.Add(contentControl);

OP绑定了TabControl子类ItemsControl,所以相同的方法应该起作用。