我在代码上遇到设计师错误:
组件我愿意为:
定义属性列表using System.Collections.Generic;
using System.ComponentModel;
using System.Windows.Forms;
namespace TestProjectForProperty.Test
{
public class MyTreeView : TreeView
{
private List<TypeDescriptorBase> _descriptorsAvailable = new List<TypeDescriptorBase>();
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public List<TypeDescriptorBase> 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号位......视觉工作室 2010 \ Projects \ TestProjectForProperty \ TestProjectForProperty \ Form1.resx 134 5 TestProjectForProperty
在Resx文件中,当出现此错误时,内部存在带有base64编码内容的数据字段。
我一直在寻找答案,但我得到的最好的是重新开始一切,它没有帮助我,你们有什么建议吗?我正在使用.net 4客户端和Visual Studio 2010
答案 0 :(得分:7)
根据我的经验,这是由于引用库的版本更改或lib本身的更改,其中包含您在用户控件中定义的属性的支持类型。解决方案是“强迫”#34;视觉工作室设计师重新初始化它的那种类型的设计师代码,而不是期望找到一个&#34; canned&#34;它的版本来自控件的.resx文件。
1)删除控件的.resx文件中的违规数据部分。这将是与您的用户控件关联的.resx文件的xml中的一个部分,其中包含一个节点:<data></data>
- name属性将设置为您在属性中命名该对象的任何内容你添加这种类型的任何东西。 <data>/data>
部分包含base64编码的字符串,该字符串是类型来源的库的名称和版本的编码形式。这就是问题所在,因为它现在包含您不再引用的库的编码版本和/或版本号,以便包含该类型。删除整个<data>/data>
部分,从打开到结束标记,保存更改并关闭文件。现在&#34;神器&#34;走了。
2)现在在设计器文件中找到控件的位置,其中类型被实例化;这是由visual studio为您生成的初始化代码,它是期望加载&#34; canned&#34; .resx文件中包含的base64编码字符串的类型定义。该行看起来像这样:
this.myCtrlFoo.MyPropertyFroo = ((MyNamespaceFoo.MyTypeFoo)(resources.GetObject("myCtrlFoo.MyPropertyFroo")));
...现在只需替换resources.GetObjec调用实例化适当类型的新实例,如下所示:
this.myCtrlFoo.MyPropertyFroo = ((MyNamespaceFoo.MyTypeFoo)(new MyNamespaceFoo.MyTypeFoo()));
...现在将更改保存到文件中,关闭它,重建,现在应该构建所有内容。运行OK。
答案 1 :(得分:3)
将MyTreeView
和TypeDescriptorBase
类放入另一个项目中,并从GUI项目中引用它将解决问题。
我不确定为什么会出现这个问题 - 我猜这与序列化过程为DescriptorsAvailable Property生成base64字符串的方式有关。也许其他人可以给我们一些见解。
答案 2 :(得分:1)
我已经在这方面挣扎了很多;我有三个用户控件都暴露了相同的非设计器属性,但由于某种原因,对三个中的两个的任何更改都会立即导致下一个构建失败并出现同样的问题。这是在VS 2015。
我不得不将以下两个属性添加到在resx文件中不断扩展的属性中,并且从那时起就没有发生过。它对我有用,因为它们无论如何都不适用于设计师。
[Browsable(false)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
答案 3 :(得分:1)
对我来说,当我使用自定义类作为用户控件的属性时,会发生此错误。当我从属性切换到传统的get-和set-方法时,错误消失了。我想这是因为属性已经在设计时编译,所以当你构建整个项目时,会编译一个新版本的自定义类,它与控件的一个版本是分开的,引用就会被破坏。
对我来说,使用自定义类库存,我所要做的就是从这种基于属性的方法切换:
public Inventory Resources {get;set;}
这种基于方法的方法:
private Inventory resources;
public Inventory getResources() { return resources; }
public void setResources(Inventory newResources) { resources = newResources; }
我希望这对某人有所帮助,因为我花了几个小时才搞清楚。
答案 4 :(得分:0)
对于我来说,我遇到了错误:在基于mcr.microsoft.com/powershell而不是mcr.microsoft的浅色Windows容器中执行了“错误MSB3103:无效的Resx文件。找不到指定的模块”。 com / windows:1909(在1909年正常工作)。 该错误是由于资源图标被内部PNG压缩所致。 可以通过在Visual Studio上打开资源来检查它:“项目”>“属性”>“ Ressources.resx”,选择图标,双击图标,检查标题的结尾是“ ..,BMP]”还是“ ... ,PNG]“)。 使用未压缩的格式更新图标可以解决“无效的Resx文件”问题。
答案 5 :(得分:-1)
我今天在寻找类似问题的解决方案时偶然发现了这个问题。
不幸的是,以上方法都不适合我,但是我的问题是我有不同版本的 .NET Framework 用于不同的项目。例如;
项目 A - .NET Framework 4.7.2 项目 B - .NET Framework 4
项目 B 引用项目 A 的地方。解决方案只是将项目 B 的 .NET Framework 版本更改为 4.7.2(在我的情况下),嘿,问题很快就解决了。
遗憾的是,在这种情况下,Visual Studio 没有提供更有用的错误消息,但需要注意一些事项!