【问题标题】:Null reference exception on installed application已安装应用程序的空引用异常
【发布时间】:2013-04-09 23:34:40
【问题描述】:

我的场景是我在我的开发机器上创建了一个 VB.NET 应用程序,现在希望使用打包和部署向导将它分发到另一台机器上。

开发机器上的代码完美运行,但是当我将它安装在目标机器上时,它给出了一个空引用异常。

我在目标机器上有一个访问数据库,它是我在我的开发机器上使用的数据库的精确副本。我的连接字符串在我的 app.config 文件中定义,我不知道如何继续。

这是我的 app.config 文件,其中包含我的连接字符串:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
  <add name="connString"
       connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Dave\Documents\duraGadget.mdb"
       providerName="System.Data.OleDb" />
</connectionStrings>
<startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client" />
</startup>
</configuration>

这是我的 Form1 加载(根据错误消息出现空指针):

 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

    constring = ConfigurationManager.ConnectionStrings("connString").ConnectionString()

    Dim sql As String = "SELECT * FROM duragadget ORDER BY skuNo ASC"
    Dim connection As New OleDbConnection(constring)
    Dim dataadapter As New OleDbDataAdapter(sql, connection)
    Dim ds As New DataSet()
    connection.Open()
    dataadapter.Fill(ds, "dura")
    connection.Close()
    DataGridView1.DataSource = ds
    DataGridView1.DataMember = "dura"

    DataGridView1.Columns(1).Width = 125
    DataGridView1.Columns(2).Width = 125
    DataGridView1.Columns(3).Width = 125
    DataGridView1.Columns(4).Width = 125
    DataGridView1.Columns(5).Width = 5000

End Sub

这是目标机器上错误消息框对话框中显示的错误消息:

有关调用的详细信息,请参阅此消息的末尾 即时 (JIT) 调试,而不是此对话框。

*****异常文本** ***** System.NullReferenceException:对象引用未设置为对象的实例。 在 DuraGadget.Form1.Form1_Load(对象发送者,EventArgs e) 在 System.EventHandler.Invoke(对象发送者,EventArgs e) 在 System.Windows.Forms.Form.OnLoad(EventArgs e) 在 System.Windows.Forms.Form.OnCreateControl() 在 System.Windows.Forms.Control.CreateControl(布尔 fIgnoreVisible) 在 System.Windows.Forms.Control.CreateControl() 在 System.Windows.Forms.Control.WmShowWindow(消息和 m) 在 System.Windows.Forms.Control.WndProc(消息和 m) 在 System.Windows.Forms.ScrollableControl.WndProc(消息和 m) 在 System.Windows.Forms.Form.WmShowWindow(消息和 m) 在 System.Windows.Forms.Form.WndProc(消息和 m) 在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(消息& m) 在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(消息和 m) 在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

***** 加载的程序集** ***** mscorlib 程序集版本:4.0.0.0 Win32版本:4.0.30319.296 (RTMGDR.030319-2900)

代码库:file:///c:/WINDOWS/Microsoft.NET/Framework/v4.0.30319/mscorlib.dll

DuraGadget 程序集版本:1.0.0.0 Win32版本:1.0.0.0

代码库:file:///C:/Program%20Files/Default%20Company%20Name/DSN%20new%20Upgrade/DuraGadget.exe

Microsoft.VisualBasic 程序集版本:10.0.0.0 Win32版本:10.0.30319.1 构建者:RTMRel

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/Microsoft.VisualBasic/v4.0_10.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll

系统 程序集版本:4.0.0.0 Win32版本:4.0.30319.1001 构建者:RTMGDR

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System/v4.0_4.0.0.0__b77a5c561934e089/System.dll

System.Core 程序集版本:4.0.0.0 Win32版本:4.0.30319.1 构建者:RTMRel

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Core/v4.0_4.0.0.0__b77a5c561934e089/System.Core.dll

System.Windows.Forms 程序集版本:4.0.0.0 Win32版本:4.0.30319.1002 构建者:RTMGDR

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Windows.Forms/v4.0_4.0.0.0__b77a5c561934e089/System.Windows.Forms.dll

系统.绘图 程序集版本:4.0.0.0 Win32版本:4.0.30319.1001 构建者:RTMGDR

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Drawing/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll

System.Runtime.Remoting 程序集版本:4.0.0.0 Win32版本:4.0.30319.1 (RTMRel.030319-0100)

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Runtime.Remoting/v4.0_4.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll

系统.数据 程序集版本:4.0.0.0 Win32版本:4.0.30319.1 (RTMRel.030319-0100)

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_32/System.Data/v4.0_4.0.0.0__b77a5c561934e089/System.Data.dll

系统.配置 程序集版本:4.0.0.0 Win32版本:4.0.30319.1 (RTMRel.030319-0100)

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Configuration/v4.0_4.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll

System.Xml 程序集版本:4.0.0.0 Win32版本:4.0.30319.1 构建者:RTMRel

代码库:file:///C:/WINDOWS/Microsoft.Net/assembly/GAC_MSIL/System.Xml/v4.0_4.0.0.0__b77a5c561934e089/System.Xml.dll

***** JIT 调试 ** ***** 要启用即时 (JIT) 调试,为此的 .config 文件 应用程序或计算机 (machine.config) 必须具有 在 system.windows.forms 部分设置的 jitDebugging 值。 应用程序还必须通过调试进行编译 已启用。

例如:

启用 JIT 调试后,任何未处理的异常 将发送到计算机上注册的 JIT 调试器 而不是被这个对话框处理。

【问题讨论】:

  • 您确定无论您的应用程序在何处运行,您都可以访问用户文件夹吗?大多数情况下,用户文件夹被锁定为不可用,具体取决于您使用的 Windows 版本。
  • @kadumel 如何使安全性可用,以便可以访问所有安全性?目标机器使用XP
  • 把你的数据库放到C:\,看看能不能打到。如果可以,那可能就是问题所在。如果仍然没有,那么还有另一个问题。如果是这种情况,那么您将需要编辑该文件夹的权限

标签: .net vb.net nullreferenceexception


【解决方案1】:

这是您的连接字符串中的来源:

Data Source=C:\Users\Dave\Documents\duraGadget.mdb

你机器上 exe 的路径:

C:/Program Files/Default Company Name/DSN new Upgrade/DuraGadget.exe

很可能无法打开 duraGadget 文件,因为指定文件夹(在目标计算机上)中不存在,因为 C:\Users\Dave 目录完全不存在。你说的是Windows XP,XP没有C:\Users文件夹。是的。更新连接字符串的路径。

【讨论】:

  • 感谢您的回答。我自己在 XP 机器上添加了用户文件夹,这是访问数据库文件所在的位置。所以理论上是在那个连接路径上。需要重命名.exe文件的连接路径吗?
  • 只要可以在第二台机器上准确在 C:\Users\Dave\Documents\duraGadget.mdb 找到数据库文件,那么应该没问题。也许下次您可以将数据库文件添加到与您的 exe 相同的目录中,或者更好的是,安装 sql server express 并访问数据库而不是数据库文件
  • @Amegon 感谢您的回复。这在理论上听起来很简单,但最终数据库将驻留在 Z:\Sku\duraGadget.mdb 位置。现在这是简单地更改我的连接字符串的情况吗?另外我不知道在这种情况下是否有任何区别,但我的数据库是拆分的。我有一个 duraGadget.mdb 和一个 duraGadget_be.mdb。我应该指向后端副本吗?
  • @user1352057 嗯,我想任何允许您在两台 PC 上使用相同连接字符串的解决方案都会很好。所以一个真正的 sql server 是好的,因为连接字符串包含 pc 名称(不管哪个执行它),我想如果你坚持使用数据库文件,那么将它更新为网络路径也是一种改进.但请确保 Windows 安全规则不会禁止对其进行读写。并确保另一台电脑也以相同的方式链接网络路径,即使它来自自己。所以你的后顾之忧少了。对不起,我不知道后端
  • @user1352057 您需要将 .mdb 文件准确地放在连接字符串源点的位置。如果您想让您的字符串指向一个已知位置,或者您想创建它指向的文件夹,这取决于您。唯一重要的是:.mdb 文件必须存在。
【解决方案2】:

大家感谢您的所有建议。经过数小时的工作后,我最终破解了它。这是一个组合。对于处于类似情况的任何人,请通过右键单击您的项目文件夹...属性使用发布选项,然后通过发布向导发布一键部署。另外我正在使用不同的数据库。拆分数据库给我带来了麻烦,在我的情况下不需要。更改这些问题并在我的 app.config 中声明单个连接字符串,以及确保我的数据集连接字符串设置正确 最终对其进行排序,我现在可以将其安装在 XP...Win7 等上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多