我收到运行时错误“'SensionVB.CommonCall'的类型初始化程序引发异常。”在尝试实例化对象调用时:
Dim general As New SensionVB.CommonCall
当代码在代码中遇到上述行时单步执行并失败,它就会执行。
Microsoft的建议是检查null,或者在这种情况下添加new也不是
SensionVB =项目 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
答案 0 :(得分: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文档(以及扩展名,成员):
当运行共享构造函数时,实际上主要依赖于实现,但如果明确定义了共享构造函数,则会提供几个保证:
- 在创建类类型的任何实例之前运行共享构造函数。
- 共享构造函数在访问结构类型的任何实例成员之前运行,或者在显式调用结构类型的任何构造函数之前运行。调用为结构创建的隐式无参数构造函数不会导致共享构造函数运行。
- 在引用任何类型的共享成员之前运行共享构造函数。
- 在加载从该类型派生的任何类型之前运行共享构造函数。
- 在单次执行程序期间,共享构造函数不会运行多次。
您可能会发现创建一个用于初始化共享字段的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
这很可能无法解决您的问题,但它可能更容易找到并处理(空字符串等)
答案 1 :(得分: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