でAccessViolationException私はVS2015で実行されている大規模なvb.net x86のプロジェクトを持っていると.NET 4.5.2診断、最適化コンパイルされたコード
それをコンパイルして最適化することなく、デバッグで実行された場合、それがOKに動作します。しかし、最適化を有効にしてリリースモードでコンパイルして実行すると、同じ無害なコード行でさまざまな例外が発生します。私はリリースモードでそれをデバッグしようとしましたが、ブレークポイントは信頼できません。また、それをデバッグする行為も例外を修正するようです。また、コードを変更すると(たとえば、MsgBoxを情報を表示するなど)問題が解決されない場合があります。たとえば、私は(制御)リストへのArrayListを変更しないと、それは前にやったが、現在は別の場所に移動するという問題はもはや発生しました。
私は異なる時間に、以下のすべて受け取った:AccessViolationExceptionで AccessViolationException、 とNullReferenceException(どこか深い.NETクラス内) とFatalExecutionEngineError
例外の詳細は、これがしばしばある」ことを除いては何も伝えていないが他のメモリが壊れていることを示す "。スタックトレースは無意味であり、無効なメモリアドレスであったと考えられていることの記述はありません。
私はまた、コンパイラに何の最適化についての意味の詳細を見つけることができません実際にはない - 一つの解決策は、最適化をオフにするかもしれないが、私は利益/マイナスの影響がこれを行うのが何であるかを理解していません。
は、信頼性のない最適ですか?何が起こっているのか、どうやって試してみることができますか?
我々が使用する唯一のアンマネージコードは、ファイル拡張子に関連するアイコンを取得するためにいくつかの呼び出しである - そして、管理対象オブジェクトにクローニングし、アンマネージメモリが破壊されています。これはかなり標準的なものであり、同じAPIが1.1から4.5.2まで10年間使用されています。
私が問題に
を再現する小さなプロジェクトを作成することはできませんここでは、それが今の私が持っている唯一の潜在的な原因だとして、アイコンを抽出するために使用するコードです。これは、他の場所から借りたと私は本当にそれがあるべきとして良いことだかどうかを言うことができない:私は偶然これに解決策に出くわし
Public Class IconExtractor
<Flags()> Private Enum SHGFI
SmallIcon = &H1
LargeIcon = &H0
Icon = &H100
DisplayName = &H200
Typename = &H400
SysIconIndex = &H4000
UseFileAttributes = &H10
End Enum
<StructLayout(LayoutKind.Sequential)>
Private Structure SHFILEINFO
Public hIcon As IntPtr
Public iIcon As Integer
Public dwAttributes As Integer
<MarshalAs(UnmanagedType.LPStr, SizeConst:=260)> Public szDisplayName As String
<MarshalAs(UnmanagedType.LPStr, SizeConst:=80)> Public szTypeName As String
Public Sub New(ByVal B As Boolean)
hIcon = IntPtr.Zero
iIcon = 0
dwAttributes = 0
szDisplayName = vbNullString
szTypeName = vbNullString
End Sub
End Structure
Private Declare Auto Function SHGetFileInfo Lib "shell32" (
ByVal pszPath As String, ByVal dwFileAttributes As Integer,
ByRef psfi As SHFILEINFO, ByVal cbFileInfo As Integer, ByVal uFlags As SHGFI) As Integer
<DllImport("user32.dll", SetLastError:=True)>
Private Shared Function DestroyIcon(ByVal hIcon As IntPtr) As Boolean
End Function
Public Shared Sub GetIconsForFile(ByVal rstrFileName As String, ByRef rzSmallIcon As Icon, ByRef rzLargeIcon As Icon)
Dim zFileInfo As New SHFILEINFO(True)
Dim cbSizeInfo As Integer = Marshal.SizeOf(zFileInfo)
Dim flags As SHGFI = SHGFI.Icon Or SHGFI.UseFileAttributes Or SHGFI.SmallIcon
SHGetFileInfo(rstrFileName, 256, zFileInfo, cbSizeInfo, flags)
' Use clone so we can destroy immediately
rzSmallIcon = DirectCast(Icon.FromHandle(zFileInfo.hIcon).Clone, Icon)
DestroyIcon(zFileInfo.hIcon)
zFileInfo = New SHFILEINFO(True)
cbSizeInfo = Marshal.SizeOf(zFileInfo)
flags = SHGFI.Icon Or SHGFI.UseFileAttributes Or SHGFI.LargeIcon
SHGetFileInfo(rstrFileName, 256, zFileInfo, cbSizeInfo, flags)
' Use clone so we can destroy immediately
rzLargeIcon = DirectCast(Icon.FromHandle(zFileInfo.hIcon).Clone, Icon)
DestroyIcon(zFileInfo.hIcon)
End Sub
End Class