2

我收到一个运行时错误“'SensionVB.CommonCall' 的类型初始化程序引发了异常。” 尝试实例化对象调用时:

Dim general As New SensionVB.CommonCall

当单步执行代码时,一旦遇到上述代码行并失败,它就会执行 .

微软的建议是检查空值,或者添加新的,在这种情况下都不是真的

SensionVB = Project CommonCall = 具有各种功能的公共类

Public Class CommonCall
Protected WithEvents litOne As System.Web.UI.WebControls.Literal
Public Shared sConnection As String = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString").ConnectionString
Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)
Public Shared sMaxSerialNumber As String = "S000001"
Public Shared bLoggedin As Boolean = False
Public Shared iPageWidth As Integer = 1024

Public Shared isValidPassword As Boolean = False
Public Shared strCompanyID As String = ""
Public Shared strSecurityID As String = ""

Dim Response As New HttpResponse(HttpWriter.Null)
Const TimeOutInMinutes As Integer = 60
Const SiteTitle As String = "SensiOn"
Public Const PageWidth As Integer = 1250
Public SSOenabled As Boolean
Const SuperUserEmails As String = "super@domain.com"
Public Sub Initialize()
    oConnection.Open()
End Sub
4

2 回答 2

3

我看到三行可能是罪魁祸首:


Public Shared sConnection As String = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString").ConnectionString

这里有几个潜在的问题。一,您的连接字符串名称(“SerialStamperConnectionString”)不正确。如果此名称与 web.config 中的键不匹配,则它将返回Nothing,当您尝试获取该ConnectionString属性的值时会导致 NullReferenceException。


Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)

可能是您上面的连接字符串在 web.config 中没有正确配置,因此返回Nothing为 ConnectionString。如果 sConnection 已设置为Nothing,则 MysqlConnection 构造函数可能会抛出 NullReferenceException。


Dim Response As New HttpResponse(HttpWriter.Null)

如果HttpWriter.Null是,Nothing那么这也可能是您的问题的根源(出于上述相同的原因)。


如果这些建议似乎都没有导致问题,那么我建议发布有关您的问题的更多信息(包括堆栈跟踪)。提供一百万个信誉点不会向我们提供有关您的代码的任何其他信息。


附录
根据关于共享构造函数(以及扩展成员)的 VB 文档:

共享构造函数的确切运行时间主要取决于实现,但如果显式定义了共享构造函数,则会提供一些保证:

  • 共享构造函数在创建任何类类型的实例之前运行。
  • 共享构造函数在访问结构类型的任何实例成员之前运行,或者在显式调用结构类型的任何构造函数之前运行。调用为结构创建的隐式无参数构造函数不会导致共享构造函数运行。
  • 共享构造函数在引用任何类型的共享成员之前运行。
  • 共享构造函数在从该类型派生的任何类型加载之前运行。
  • 在程序的单次执行期间,共享构造函数不会运行多次。

9.3.2 共享构造函数

您可能会发现创建一个 Shared 构造函数来初始化您的共享字段很有用:

Public Shared sConnection As String
Public Shared oConnection As MySqlClient.MySqlConnection

Shared Sub New()
    Dim l_connectionString = ConfigurationManager.ConnectionStrings("SerialStamperConnectionString")
    If l_connectionString IsNot Nothing Then
        sConnection = l_connectionString.ConnectionString
        oConnection = New MySqlClient.MySqlConnection(sConnection)
    Else
        ' What to do here?
    End If
End Sub

这很可能不会解决您的问题,但它可能更容易找到和处理(空字符串等)

于 2012-10-26T02:02:07.290 回答
1

此行可能会使其失败:

Dim Response As New HttpResponse(HttpWriter.Null)

因为它同时被初始化。尝试将其设置为:

Dim Response As HttpResponse = Nothing 

并在代码中对其进行初始化以进行初始化。您还可以检查是否获得了空对象。

假设您在共享变量中获得正确的结果,您还在进行一些初始化:

Public Shared oConnection As New MySqlClient.MySqlConnection(sConnection)

这些不会影响初始化,因为它们是共享的,但 IMO 是不好的做法。

而不是Initialize(),为什么不使用New()

Public Sub New()
    'TODO move init. of Response to here.
    'TODO move init. of oConnection to here.
    oConnection.Open() 'TODO error check
End Sub
于 2012-10-23T23:56:48.727 回答