无效的Resx文件。 无法加载类型错误为什么?

我在代码上遇到设计器错误:

组件我愿意为以下内容定义属性列表:

using System.Collections.Generic; using System.ComponentModel; using System.Windows.Forms; namespace TestProjectForProperty.Test { public class MyTreeView : TreeView { private List _descriptorsAvailable = new List(); [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)] public List DescriptorsAvailable { get { return _descriptorsAvailable; } set { _descriptorsAvailable = value; } } } } 

描述符本身:

 using System; namespace TestProjectForProperty.Test { [Serializable] public class TypeDescriptorBase { public string Name { get; set; } public override string ToString() { return Name; } } } 

如果我尝试在窗体上使用该组件并将属性表或组件的构造函数中的任何项添加到DescriptorsAvailable属性,我会收到以下错误

错误1无效的Resx文件。 无法加载类型System.Collections.Generic.List`1 [[TestProjectForProperty.Test.TypeDescriptorBase,TestProjectForProperty,Version = 1.0.0.0,Culture = neutral,PublicKeyToken = null]],mscorlib,Version = 4.0.0.0,Culture = neutral ,PublicKeyToken = b77a5c561934e089,用于.RESX文件。 确保已将必要的引用添加到项目中。 第134行,位置5. … \ visual studio 2010 \ Projects \ TestProjectForProperty \ TestProjectForProperty \ Form1.resx 134 5 TestProjectForProperty

在Resx文件中,当出现此错误时,内部存在带有base64编码内容的数据字段。

我一直在寻找答案,但我得到的最好的是重新启动一切,它没有帮助我,你们有什么建议吗? 我正在使用.net 4客户端和visual studio 2010

MyTreeViewTypeDescriptorBase类放入另一个项目中,并从GUI项目中引用它将解决问题。

我不确定为什么会出现问题 – 我猜这与序列化过程为DescriptorsAvailable属性生成base64字符串的方式有关。 也许其他人可以给我们一些见解。

根据我的经验,这是由于引用库的版本更改或lib本身的更改,其中包含您在用户控件中定义的属性的支持类型。 解决方案是“强制”可视工作室设计者重新初始化该类型的设计器代码,而不期望从控件的.resx文件中检索它的“jar装”版本。

1)删除控件的.resx文件中的违规数据部分。 这将是与您的用户控件关联的.resx文件的xml中的一个部分,其中包含一个节点: – name属性将设置为您在属性中命名该对象的任何内容你添加这种类型的任何东西。 /data>部分包含base64编码的字符串,该字符串是类型来源的库的名称和版本的编码forms。 这就是问题所在,因为它现在包含您不再引用的库的编码版本和/或版本号,以便包含该类型。 删除整个/data>部分,从打开到结束标记,保存更改并关闭文件。 现在“神器”消失了。

2)现在在设计器文件中找到控件的位置,其中类型被实例化; 这是visual studio为您生成的初始化代码,它是期望从.resx文件中包含的base64编码字符串加载该类型的“预制”定义的地方。 该行看起来像这样:

 this.myCtrlFoo.MyPropertyFroo = ((MyNamespaceFoo.MyTypeFoo)(resources.GetObject("myCtrlFoo.MyPropertyFroo"))); 

…现在只需替换​​resources.GetObjec调用实例化适当类型的新实例,如下所示:

 this.myCtrlFoo.MyPropertyFroo = ((MyNamespaceFoo.MyTypeFoo)(new MyNamespaceFoo.MyTypeFoo())); 

…现在将更改保存到文件,关闭它,重建,现在一切都应该构建并运行正常。

我对此苦苦挣扎; 我有三个用户控件都暴露了相同的非设计器属性,但由于某种原因,对三个中的两个的任何更改都会立即导致下一个构建失败并出现同样的问题。 这是在VS 2015。

我不得不将以下两个属性添加到resx文件中不断扩展的属性,并且从那时起就没有发生过。 它对我有用,因为无论如何它们都不适用于设计师。

[Browsable(false)] [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]

对我来说,当我使用自定义类作为用户控件的属性时发生此错误。 当我从属性切换到传统的get-和set-方法时,错误消失了。 我想这是因为属性已经在设计时编译,所以当你构建整个项目时,会编译一个新版本的自定义类,它与一个控件分开,并且引用被破坏。

对我来说,使用自定义类库存,我所要做的就是从这种基于属性的方法切换:

 public Inventory Resources {get;set;} 

这种基于方法的方法:

 private Inventory resources; public Inventory getResources() { return resources; } public void setResources(Inventory newResources) { resources = newResources; } 

我希望这对某人有所帮助,因为我花了几个小时才搞清楚。