【问题标题】:Visual studio shows endless messages "Code generation for property 'valueMember' failed."Visual Studio 显示无休止的消息“属性 'valueMember' 的代码生成失败。”
【发布时间】:2012-11-11 02:53:13
【问题描述】:

在使用 Visual Studio 2008 愉快地破解这个 C# 应用程序几天后,我被一连串的错误对话框所震惊:

属性“valueMember”的代码生成失败。
错误是:'对象引用未设置为对象的实例。'

这种情况现在经常发生在我对设计器进行微小更改时,例如将控件移几个像素,然后尝试保存。每秒都会出现几个这样的错误对话框,让我忙着通过敲击 Enter 键来取消所有这些对话框,同时尝试让 alt-F4 关闭 VS。

最终我确实让 VS 关闭并保存我所做的更改。重新启动 VS 后,我对整个项目进行“清理”,然后“构建”,一切正常,应用程序运行正常,没有问题。

直到我对表单设计器进行另一个细微的更改。

我不知道我的应用中有任何属性valueMember

这让我抓狂,这对我的项目来说是一个真正的亮点。任何帮助表示赞赏。

【问题讨论】:

  • 听起来设计师对每个表单后面的 *.designer.cs 文件有问题。那将是开始寻找的地方。

标签: c# visual-studio designer


【解决方案1】:

由于这发生在设计时,您可能有一个自定义控件,它需要一个没有默认值的参数或其他值。

在 Visual Studio 的设计视图中时;创建了一个控件实例以在可视化编辑器上呈现它,但如果控件需要在呈现之前设置属性,则会导致错误。

您能否检查所有自定义控件是否具有默认值,并且构造函数中引用的任何不能具有默认值的内容都由DesignMode 属性包装 - 请参阅http://msdn.microsoft.com/en-us/library/system.componentmodel.component.designmode.aspx

【讨论】:

  • 感谢您的提示。我认为我在继承的这个项目中没有自定义控件来维护,但是全局搜索确实在某些 X.designer.cs 文件中找到了“valueMember”属性。当错误再次出现时,我将研究该代码。这就留下了为什么错误消息以无限数量出现而不是只出现一次的问题。
  • 这是一大堆继承的代码,我为很多变量添加了默认值。无论如何,这是一个很好的设计原则。这通常会导致更少的 null-ref 异常,并且 VS 问题也不再返回。
【解决方案2】:

您可以使用另一个 Visual Studio 调试设计器并附加到进程。如果您遇到异常,应该很容易找到它。 通常,当打开设计器时,构造函数当然还有 initializeComponent 正在运行。

【讨论】:

  • 恕我直言,这应该是公认的答案。带我去有问题的代码。很棒的小费!
  • 优秀。我从来没有想过这个。
  • 如果可以理解并提供更多细节(例如,哪个过程+要查找的内容),那就太好了...
  • 我同意@stigzler。需要更多关于如何执行此操作的详细信息。
【解决方案3】:

我不得不面对这个问题。由于我还没有找到解决方案(很多继承),我可以告诉: .SuspendLayout().ResumeLayout() 可能在代码或其中之一中丢失。 .BeginInit().EndInit() 也是如此。他们之间预计会有= new ... 和一些属性设置。也许遇到这个问题的人会根据这些信息找到解决方案。

【讨论】:

  • 此外,虽然存在继承,但重要的是修饰符:public、private、protected - 用于控件。
【解决方案4】:

尝试关闭并重新打开 Visual Studio。也许这看起来很傻,但它确实有效!

【讨论】:

  • 节省了一些时间,但在 Visual Studio 中关闭和打开解决方案对我有用。我不得不放弃对特定表单的更改,导致错误对话框在我关闭之前显示。
【解决方案5】:

类似于@Chanipoz 的回答(关闭/重新打开),在我关闭主表单设计器窗口后,我的组件丰富/用户控件无处不在的表单应用程序开始愉快地编译。

我使用此代码堆栈已有多年,直到今天才发现错误。不确定它来自哪里。但是,今天在设计器中打开表单的事情让一切都不愉快。只需将其从屏幕上关闭即可顺利进行。

【讨论】:

  • 您是否也遭受过一连串错误对话框的困扰,这些对话框的出现速度快于您关闭它们的速度?
  • 似乎只有少数.. 但是.. 只要在设计器中打开特定表单,它就非常致力于发出这些错误框
【解决方案6】:

使用 Visual Studio 的另一个实例附加到 Visual Studio 的第一个实例。

转到调试-> 附加到进程并查找 devenv.exe 进程。由于您将运行两个 devenv.exe 进程,因此您可能希望选择 ID 较低的进程,这通常是运行的第一个 Visual Studio 实例。

【讨论】:

  • 感谢您的回答。由于我在过去 7 年中分几步从 VS2008 升级到 VS2017 并且正在处理许多不同的代码,更加结构化,我再也没有看到这个问题了。但如果今天有人可能会遇到这种情况,您的回答可能会有所帮助。
【解决方案7】:

问题是缺少控件上公共属性的初始化代码。这将在您将控件添加到设计器时为您添加,但是如果您将控件替换为派生控件,或者更新组件,那么设计器将不知道如何处理。

如果您有一个带有公共属性 PropertyA 的控件 (wincontrol),并将其添加到表单 (myForm),那么设计器会将所有必要的属性初始化添加到 myForm.Designer.cs。类似的东西;

Wincontrol1.PropertyA = new List<widget>();

需要稍微修改控件的情况并不少见,假设我们有一个新控件 MyWinControl

public partial class MyWinControl : WinControl
{
    public List<wodget> PropertyDer1;
    protected List<wodget> PropertyDer2;
}

如果您在 myForm.Designer.cs 中将此新控件替换为旧控件,那么您很可能会遇到此问题。原因是 PropertyDer1 在 winforms 设计器中没有初始化。 PropertyDer2 不会引起任何问题,因为它受到保护。同样,如果您有一个自定义组件,并且在将组件添加到表单后添加了一个新的公共属性。

但是,如果您删除了窗体上的 WinControl 实例,而是将 MyWinControl 的一个实例拖到窗体上,则会发生正确的初始化并且您不会看到错误。设计人员将像这样创建新控件

Wincontrol1.PropertyA = new List<widget>();
Wincontrol1.PropertyDer1= new List<wodget>();

有两种简单的解决方案不需要对设计者隐藏属性。 1.如果属性不需要公开,给它正确的修饰符 2. 如果该属性确实需要公开,那么只需像上面的代码一样编辑 myForm.Designer.cs 中的代码以添加缺少的初始化程序

【讨论】:

    【解决方案8】:

    如果有帮助的话,我刚刚检测到一个带有相同错误消息的案例,无法删除: 我正在用法语开发一个应用程序,我必须创建一个 ToolStripMenuItem,其中包含一个重音词,例如“annulées”。 系统生成了一个类似“annuléesToolStripMenuItem”的菜单项,而重音是罪魁祸首。 足以删除该项目,用英语再次创建它,只需更改菜单项的 Text 属性。 希望对您有所帮助。

    【讨论】:

    • unicode 方法名称是否只是导致构建错误或运行异常,或者这是否会生成很多很多错误对话框,比您关闭它们的速度更快?
    • 不,它只会生成一条很长的错误消息并停止发布。纠正重音字母确实解决了问题。
    猜你喜欢
    • 2011-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多