【发布时间】:2017-10-24 16:01:37
【问题描述】:
我有一个具有如下属性的控件:
public BindingList<I> X { get; private set; } = new SortableBindingList<I>();
I 是一个接口。它构建良好,运行良好,但是当我将此控件添加到表单时(无论该表单是否在同一个程序集中都无关紧要),然后尝试在 Visual Studio(2017)中打开该表单,该表单是未显示并出现以下错误消息:
“I[]”类型的对象无法转换为“I[]”类型。
调用堆栈为:
在 System.RuntimeType.TryChangeType(Object value, Binder binder, CultureInfo 文化,布尔需要SpecialCast)在 System.RuntimeType.CheckValue(对象值,Binder binder,CultureInfo 文化,BindingFlags 调用Attr)在 System.Reflection.RtFieldInfo.UnsafeSetValue(对象 obj,对象值, BindingFlags invokeAttr、Binder binder、CultureInfo 文化)在 System.Runtime.Serialization.FormatterServices.SerializationSetValue(MemberInfo fi,对象目标,对象值)在 System.Runtime.Serialization.ObjectManager.CompleteObject(ObjectHolder 持有人,布尔 bObjectFullyComplete) 在 System.Runtime.Serialization.ObjectManager.DoNewlyRegisteredObjectFixups(ObjectHolder 持有人)在 System.Runtime.Serialization.ObjectManager.RegisterObject(对象 obj, Int64 objectID, SerializationInfo info, Int64 idOfContainingObj, MemberInfo 成员,Int32[] arrayIndex) 在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.RegisterObject(对象 obj, ParseRecord pr, ParseRecord objectPr, Boolean bIsString) at System.Runtime.Serialization.Formatters.Binary.ObjectReader.ParseObjectEnd(ParseRecord 公关)在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Parse(ParseRecord 公关)在 System.Runtime.Serialization.Formatters.Binary.__BinaryParser.Run() 在 System.Runtime.Serialization.Formatters.Binary.ObjectReader.Deserialize(HeaderHandler 处理程序,__BinaryParser serParser,布尔 fCheck,布尔 isCrossAppDomain, IMethodCallMessage methodCallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流 serializationStream, HeaderHandler 处理程序, Boolean fCheck, Boolean isCrossAppDomain, IMethodCallMessage methodCallMessage) 在 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Deserialize(流 序列化流)在 System.Resources.ResXDataNode.GenerateObjectFromDataNodeInfo(DataNodeInfo dataNodeInfo, ITypeResolutionService typeResolver) 在 System.Resources.ResXDataNode.GetValue(ITypeResolutionService 类型解析器)在 System.Resources.ResXResourceReader.ParseDataNode(XmlTextReader 阅读器,布尔 isMetaData)在 System.Resources.ResXResourceReader.ParseXml(XmlTextReader reader)
我尝试添加
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
或
[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
分别按照https://stackoverflow.com/a/29720/68936和https://stackoverflow.com/a/29717/68936;
我也尝试将 getter-setter 替换为
private BindingList<I> myX = new SortableBindingList<I>();
public BindingList<I> myX { get { return myX; } }
根据https://stackoverflow.com/a/16657926/68936
无济于事。我试过关闭所有打开的文档,关闭解决方案,重新启动 Visual Studio,重建两个程序集,似乎没有任何解决办法。
【问题讨论】:
-
我在 IIS 中遇到了同样的错误,其中 X 包含 ValueTuple。这是一个在运行时在 .NET 4.7 下运行的 .NET 4.6 项目。 IIS 进程从 mscorlib (4.7) 加载 ValueTuple,即使在编译时它引用 DLL 中的 ValueTuple(DLL 文件版本 4.6.26515.6)。 IIS 项目直接引用一个 .NET 4.6 exe 文件,它也作为外部进程生成。生成此 exe 时,它使用正确的 ValueTuple 4.6 DLL,但无法反序列化从使用 mscorlib 版本的 ValueTuple 的 IIS 进程发送的数据。
标签: visual-studio-2017 windows-forms-designer