나는 아래의 코드를 사용하여 노동 조합을 지원하는 .NET의 능력을 실험하려고하지만 메시지와 함께 .NET 4.0에서 .NET 2.0 및 FatalExecutionEngineError에 System.ExecutionengineException가 발생합니다시도한 Union 구조가 System.ExecutionEngineException을 발생시키는 이유는 무엇입니까?
는 런타임이있다 치명적인 오류가 발생했습니다. 오류의 주소는 0x738b3138이고 스레드 0x1080에있었습니다. 오류 코드는 0xc0000005입니다. 이 오류 은 CLR 또는 사용자 코드의 안전하지 않거나 인증 할 수없는 부분 인 의 버그 일 수 있습니다. 이 버그의 일반적인 출처는 COM-interop 또는 PInvoke에 대한 사용자 마샬링 오류입니다. 은 스택을 손상시킬 수 있습니다.
본인은이 코드가 작동하지 않아야한다는 데 동의하지만이 예외는 예상하지 않았습니다. 이것은 .NET 버그입니까?
Class POLine
Public price As Decimal
Public VendorItem As String
End Class
Class SOLine
Public price As Decimal
Public Required As DateTime
End Class
<System.Runtime.InteropServices.StructLayout(System.Runtime.InteropServices.LayoutKind.Explicit)> _
Structure LineRef
<System.Runtime.InteropServices.FieldOffset(0)> _
Public poLine As POLine
<System.Runtime.InteropServices.FieldOffset(0)> _
Public soLine As SOLine
End Structure
Sub Main()
Dim lr As New LineRef
lr.poLine = New POLine With {.price = 1.23D, .VendorItem = "X22"}
lr.soLine = New SOLine With {.price = 3.14D, .Required = DateTime.Now}
Console.WriteLine("{0} {1}", lr.soLine.price, lr.soLine.Required)
Console.WriteLine("{0} {1}", lr.poLine.price, lr.poLine.VendorItem)
End Sub
.NET/CLI에는 "unverifiable"이라는 코드 카테고리가 있다는 것을 알지 못했습니다. 그게 관리되는 것과 안전하지 않은 것 중 어느 것입니까? "unverifiable"이라는 코드 카테고리입니까? 안전하지 않은 코드가 "안전하지 않은"블록에 포함되지 않은 경우 프로젝트에 포함되는 것을 방지 할 수 있다고 올바르게 기억합니까? 확인할 수없는 코드를 취급하는 PEVerify 외부에 (비슷한) 비슷한 것이 있습니까? "안전하지 않은"코드를 검증 할 수없는 다른 사례가 있습니까? – BlueMonkMN
@BlueMonkMN - "안전하지 못함"과 "확인할 수없는"이 동의어라고 생각합니다. 'StructLayout' 속성의 사용이 C#과 VB.NET에서'/ unsafe' 스위치없이 허용된다는 것은 정말로 혼란 스럽습니다 (대조적으로 F #에서는 적어도 경고를 생성합니다). – kvb
CLI 사양에서는 "확인할 수 없음"이라는 용어 만 사용합니다. "Unsafe"는 C#의 것으로, C# 스펙에 의해서만 정의됩니다. 이 두 용어는 실제로 겹쳐 지지만 동일하지는 않습니다.이 질문에서 알 수 있듯이 CLI에서 확인할 수없는 코드는 C# -unsafe 범주에 속하지 않을 수 있습니다. 반면에 C# -unsafe는 항상 확인할 수 없습니다. –