【问题标题】:"Exception has been thrown by the target of an invocation"“调用的目标已抛出异常”
【发布时间】:2012-04-25 09:31:29
【问题描述】:

背景资料

我正在使用 VS2010 在 C# 中维护一个 Winforms 应用程序。主窗体有一个带有几个选项卡的 TabControl。启动对象是一个带有 Main 函数的类(这里没有什么新东西),它除了触发主窗体之外什么也不做。 该表单创建一个 Datastore 对象,该对象从静态 Settings 类获取它到 DB 服务器的连接字符串。这个类有一个静态初始化块:

static Settings()
    {
        IniReader reader = new IniReader("config.ini");
        //...
    }

配置文件位于主项目文件夹中(与启动对象相同)(也位于 bin 和 debug 文件夹中)。

问题

在解决方案资源管理器中,当我在设计器中双击主窗体以将其打开时,VS 崩溃,出现此问题标题中提到的异常,但同时出现错误,指出找不到 config.ini “C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE”中的文件。 可以通过将配置文件复制到该位置来解决该问题,但我认为这不是一个真正的解决方案。 为什么 VS 会在那个位置搜索文件? 奇怪的是,我上次打开解决方案时,并没有这个问题。从那以后我没有安装新的 Windows 更新。

备注

应用程序的架构和其他设计决策不是我的。我只是在扩展程序,在这样做的同时,我正在尝试改进架构。但这不是这个问题的主题。

【问题讨论】:

  • 我猜如果配置文件的路径(在 .csproj 文件中定义)不存在,那么 VS 默认为它自己的工作目录。听起来您已经更正了项目文件中的路径,现在可以找到它。您可以检查您的源代码控制日志,看看是否是这种情况。

标签: winforms visual-studio-2010 exception


【解决方案1】:

我想你已经明白 VS 设计器会创建一个它试图显示的表单的实例,这意味着它将调用构造函数和任何静态构造函数。

我见过的避免此类问题的最常见模式是将任何重要的初始化逻辑移动到单独的 Initialise 方法中。在那里,除了构造函数之外的任何方法中,您都可以使用...

if (!DesignMode)
{
    //your code here
}

...围绕在设计器中正确呈现表单实际上不需要的任何代码。我意识到这意味着对代码进行一些重构,您可能不想这样做,但我使用了这种方法,它很好地避免了此类问题。

【讨论】:

  • 谢谢。我一直在尝试这个,至少我得到了一个不同的错误。我想我是在正确的轨道上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-22
相关资源
最近更新 更多