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

Att*_*áth 4 .net c# designer properties visual-studio-2010

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

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

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; }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

描述符本身:

using System;

namespace TestProjectForProperty.Test
{
    [Serializable]
    public class TypeDescriptorBase
    {
        public string Name { get; set; }

        public override string ToString()
        {
            return Name;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我尝试在表单上使用组件并将属性表或组件的构造函数中的任何项添加到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

dyl*_*web 9

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

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

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

this.myCtrlFoo.MyPropertyFroo = ((MyNamespaceFoo.MyTypeFoo)(resources.GetObject("myCtrlFoo.MyPropertyFroo")));
Run Code Online (Sandbox Code Playgroud)

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

this.myCtrlFoo.MyPropertyFroo = ((MyNamespaceFoo.MyTypeFoo)(new MyNamespaceFoo.MyTypeFoo()));
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*wie 5

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

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