vb.net mscorlib.dll 中发生了“System.ArgumentNullException”类型的第一次机会异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/16237475/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
A first chance exception of type 'System.ArgumentNullException' occurred in mscorlib.dll
提问by kasperB
I a building a program that can ecnrypt and decrypt files using rijndael algorithm. But if i debug i get the following error:
我正在构建一个可以使用 rijndael 算法加密和解密文件的程序。但是如果我调试,我会收到以下错误:
A first chance exception of type 'System.ArgumentNullException' occurred in mscorlib.dll
mscorlib.dll 中发生了“System.ArgumentNullException”类型的第一次机会异常
this is my code:
这是我的代码:
Imports crypter.crypter
Public Class Form1
Private Sub btnEncrypt_Click(sender As System.Object, e As System.EventArgs) Handles btnEncrypt.Click
Dim objCrypter As New crypter.crypter
Dim strPass As String = txtPass.Text
Dim bytkey As Byte()
Dim bytIV As Byte()
bytkey = objCrypter.CreateKey(strPass)
bytIV = objCrypter.CreateIV(strPass)
objCrypter.EncryptOrDecryptFile(txtSource.Text, txtDestination.Text, bytkey, bytIV, CryptoAction.ActionEncrypt)
End Sub
Private Sub btnDecrypt_Click(sender As Object, e As System.EventArgs) Handles btnDecrypt.Click
Dim objCrypter As New crypter.crypter
Dim strPass As String = txtPass.Text
Dim bytkey As Byte()
Dim bytIV As Byte()
bytkey = objCrypter.CreateKey(strPass)
bytIV = objCrypter.CreateIV(strPass)
objCrypter.EncryptOrDecryptFile(txtSource.Text, txtDestination.Text, bytkey, bytIV, crypter.crypter.CryptoAction.ActionDecrypt)
End Sub
End Class
and this is my code from my class crypter
这是我的类密码器中的代码
Imports System
Imports System.IO
Imports System.Security
Imports System.Security.Cryptography
Public Class crypter
#Region "1. Global Variables "
'*************************
'** Global Variables
'*************************
Dim strFileToEncrypt As String
Dim strFileToDecrypt As String
Dim strOutputEncrypt As String
Dim strOutputDecrypt As String
Dim fsInput As System.IO.FileStream
Dim fsOutput As System.IO.FileStream
#End Region
#Region "2. Create A Key "
'*************************
'** Create A Key
'*************************
Private Function CreateKey(ByVal strPassword As String) As Byte()
'Convert strPassword to an array and store in chrData.
Dim chrData() As Char = strPassword.ToCharArray
'Use intLength to get strPassword size.
Dim intLength As Integer = chrData.GetUpperBound(0)
'Declare bytDataToHash and make it the same size as chrData.
Dim bytDataToHash(intLength) As Byte
'Use For Next to convert and store chrData into bytDataToHash.
For i As Integer = 0 To chrData.GetUpperBound(0)
bytDataToHash(i) = CByte(Asc(chrData(i)))
Next
'Declare what hash to use.
Dim SHA512 As New System.Security.Cryptography.SHA512Managed
'Declare bytResult, Hash bytDataToHash and store it in bytResult.
Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
'Declare bytKey(31). It will hold 256 bits.
Dim bytKey(31) As Byte
'Use For Next to put a specific size (256 bits) of
'bytResult into bytKey. The 0 To 31 will put the first 256 bits
'of 512 bits into bytKey.
For i As Integer = 0 To 31
bytKey(i) = bytResult(i)
Next
Return bytKey 'Return the key.
End Function
#End Region
#Region "3. Create An IV "
'*************************
'** Create An IV
'*************************
Private Function CreateIV(ByVal strPassword As String) As Byte()
'Convert strPassword to an array and store in chrData.
Dim chrData() As Char = strPassword.ToCharArray
'Use intLength to get strPassword size.
Dim intLength As Integer = chrData.GetUpperBound(0)
'Declare bytDataToHash and make it the same size as chrData.
Dim bytDataToHash(intLength) As Byte
'Use For Next to convert and store chrData into bytDataToHash.
For i As Integer = 0 To chrData.GetUpperBound(0)
bytDataToHash(i) = CByte(Asc(chrData(i)))
Next
'Declare what hash to use.
Dim SHA512 As New System.Security.Cryptography.SHA512Managed
'Declare bytResult, Hash bytDataToHash and store it in bytResult.
Dim bytResult As Byte() = SHA512.ComputeHash(bytDataToHash)
'Declare bytIV(15). It will hold 128 bits.
Dim bytIV(15) As Byte
'Use For Next to put a specific size (128 bits) of
'bytResult into bytIV. The 0 To 30 for bytKey used the first 256 bits.
'of the hashed password. The 32 To 47 will put the next 128 bits into bytIV.
For i As Integer = 32 To 47
bytIV(i - 32) = bytResult(i)
Next
Return bytIV 'return the IV
End Function
#End Region
#Region "4. Encrypt / Decrypt File "
'****************************
'** Encrypt/Decrypt File
'****************************
Private Enum CryptoAction
'Define the enumeration for CryptoAction.
ActionEncrypt = 1
ActionDecrypt = 2
End Enum
Private Sub EncryptOrDecryptFile(ByVal strInputFile As String, _
ByVal strOutputFile As String, _
ByVal bytKey() As Byte, _
ByVal bytIV() As Byte, _
ByVal Direction As CryptoAction)
Try 'In case of errors.
'Setup file streams to handle input and output.
fsInput = New System.IO.FileStream(strInputFile, FileMode.Open, _
FileAccess.Read)
fsOutput = New System.IO.FileStream(strOutputFile, FileMode.OpenOrCreate, _
FileAccess.Write)
fsOutput.SetLength(0) 'make sure fsOutput is empty
'Declare variables for encrypt/decrypt process.
Dim bytBuffer(4096) As Byte 'holds a block of bytes for processing
Dim lngBytesProcessed As Long = 0 'running count of bytes processed
Dim lngFileLength As Long = fsInput.Length 'the input file's length
Dim intBytesInCurrentBlock As Integer 'current bytes being processed
Dim csCryptoStream As CryptoStream
'Declare your CryptoServiceProvider.
Dim cspRijndael As New System.Security.Cryptography.RijndaelManaged
'Determine if ecryption or decryption and setup CryptoStream.
Select Case Direction
Case CryptoAction.ActionEncrypt
csCryptoStream = New CryptoStream(fsOutput, _
cspRijndael.CreateEncryptor(bytKey, bytIV), _
CryptoStreamMode.Write)
Case CryptoAction.ActionDecrypt
csCryptoStream = New CryptoStream(fsOutput, _
cspRijndael.CreateDecryptor(bytKey, bytIV), _
CryptoStreamMode.Write)
End Select
'Use While to loop until all of the file is processed.
While lngBytesProcessed < lngFileLength
'Read file with the input filestream.
intBytesInCurrentBlock = fsInput.Read(bytBuffer, 0, 4096)
'Write output file with the cryptostream.
csCryptoStream.Write(bytBuffer, 0, intBytesInCurrentBlock)
'Update lngBytesProcessed
lngBytesProcessed = lngBytesProcessed + CLng(intBytesInCurrentBlock)
End While
'Close FileStreams and CryptoStream.
csCryptoStream.Close()
fsInput.Close()
fsOutput.Close()
'If encrypting then delete the original unencrypted file.
If Direction = CryptoAction.ActionEncrypt Then
Dim fileOriginal As New FileInfo(strFileToEncrypt)
fileOriginal.Delete()
End If
'If decrypting then delete the encrypted file.
If Direction = CryptoAction.ActionDecrypt Then
Dim fileEncrypted As New FileInfo(strFileToDecrypt)
fileEncrypted.Delete()
End If
Catch
fsInput.Close()
fsOutput.Close()
If Direction = CryptoAction.ActionDecrypt Then
Dim fileDelete As New FileInfo(strOutputFile)
fileDelete.Delete()
Else
Dim fileDelete As New FileInfo(strOutputFile)
fileDelete.Delete()
End If
End Try
End Sub
#End Region
End Class
Does anybody have an idea about what might be my mistake?
有没有人知道我的错误可能是什么?
Thanks in advance,
提前致谢,
回答by Steven Magana-Zook
While I do not know the particular problem, the way I find the causes of first chance exceptions is to go to the Visual Studio Debug menu-> choose the Exceptions entry, check both boxes for Common Language Runtime Exceptions.
虽然我不知道具体问题,但我找到第一次机会异常原因的方法是转到 Visual Studio 调试菜单-> 选择异常条目,选中公共语言运行时异常的两个框。
Now when you debug, the IDE will break for all exceptions even if they are caught.
现在,当您调试时,IDE 将中断所有异常,即使它们被捕获。
Rerun your code and you should see the line that calls into mscorlib and causes the null exception.
重新运行您的代码,您应该会看到调用 mscorlib 并导致空异常的行。
Good luck!
祝你好运!

